2011-12-02 16 views
0

私が構造を持っている:C# - 構造体をフォームに参照と戻り値で渡しますか?

struct Order 
{ 
     public string orderNumber; 
     public string orderDetail; 
} 

私はその後、Form1の中にいくつかの値を代入し、Form2を参照(REF)によってそれらを渡すためにしてみてください。

(Form1) 
Order order = new Order(); 
order.orderNumber = "1234"; 
order.orderDetail = "Widgets"; 
Form2 frm2 = new Form2(ref order); 

はForm2の中で値を格納することが可能ですForm2が値の処理を完了すると、更新された構造体の値がForm1に返されます。

このシナリオでは、データを検証した後にフォームを閉じるボタンがあります。

答えて

2

一つのパターンは次のようにクラスのものを定義することです。そのようなアプローチを使用して、参照によって構造体を受け取り、モーダルダイアログをポップアップして構造体を記入するルーチンは、Holder<thatStructType>を作成し、それをフォームに渡してから、そのホルダーからデータをコピーします渡された参照に渡します。あなたの特定のシナリオでは、データ保持物を単にクラスにする方が良いかもしれませんが、構造には未解決の参照が存在しないことを知ることができるという利点があります。ルーチンが構造体を宣言してそれをある外部コードへの参照によって渡すと、そのコードは構造体内の値を返しますが、ルーチンがそれ自身を書き込むか、他のコードへの参照によって構造体を渡さない限り変更されません。対照的に、ルーチンがクラス参照を外部コードに公開している場合、コードがそのコードで何を行うかは分かりません。

なお、Holderクラスは、他の多くのシナリオでも役立ちます。たとえば、Dictionary<String, Holder<Integer>> myDictがある場合、Dictionary<String, Integer>よりもはるかに効率的に、示された項目のスレッドセーフインクリメントを実行するためにThreading.Interlocked.Increment(myDict(myKey).Value))を使用することができます。

2

Form2には、コンストラクタで渡されたorder構造体への参照を格納できるかどうかを確認することができます。答えはいいえだ。参照を格納する場合は、参照型(クラス)を使用します。このようなクラスは参照型を必要とするコードで値型を渡すと変異することが可能となり

 
class Holder<T> {public T value;} 

:時々便利です

関連する問題