2011-12-02 20 views
0

我有一个结构:C# - 通过引用和返回值将结构传递给表单?

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

我然后分配一些值在Form1并尝试通过引用(REF)通过他们到窗体2:

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

是否有可能存储在窗体2的值所以当Form2完成处理值时,它会将更新后的结构值返回给Form1?

在这种情况下,会有一个按钮在验证数据后关闭窗体。

回答

2

一种模式是定义一个类是这样的:

 
class Holder<T> {public T value;} 

这样的类能够通过,并发生变异值类型与需要参考类型的代码。使用这种方法,通过引用接受结构并假定弹出模态对话框并从中填充结构的例程可以创建一个Holder&lt;thatStructType&gt;,将它传递给表单,然后将该Holder中的数据复制回来到传入的参考。虽然在你的特定场景中,将数据控制事物简单地作为一个类可能会更好,但是结构具有的优点是可以知道没有对它们的优秀引用;如果一个例程声明一个结构并通过引用某个外部代码来传递它,那么一旦该代码返回该结构中的值将不会改变,除非或者直到该例程自己写入它或通过引用其他代码来传递该结构。相比之下,如果一个例程向外部代码公开一个类的引用,那么就不知道该代码可以用它做什么。

顺便提一下,Holder类在其他一些场景中也很有用。例如,如果有一个Dictionary<String, Holder<Integer>> myDict,可以使用Threading.Interlocked.Increment(myDict(myKey).Value))执行指定项目的线程安全增量,这比使用Dictionary<String, Integer>可能更有效。

2

我想你问的是如果Form2可以存储在构造函数中传递的order结构的引用。答案是不。如果你想存储引用,使用引用类型(一个类)。这有时是有用的