C# - 通过引用将结构传递给表单并返回值?

时间:2011-12-02 20:39:18

标签: winforms c#-4.0 struct pass-by-reference

我有一个结构:

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

然后我在Form1中分配一些值并尝试通过引用(ref)将它们传递给Form2:

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

是否可以将值存储在Form2中,以便在完成Form2处理值时,它会将更新的struct值返回到Form1?

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

2 个答案:

答案 0 :(得分:2)

我认为你问的是Form2是否可以存储对构造函数中传递的order结构的引用。答案是不。如果要存储引用,请使用引用类型(类)。

答案 1 :(得分:2)

有时候有用的一种模式是定义一个类:

class Holder<T> {public T value;}

这样的类可以使用需要引用类型的代码传递和改变值类型。使用这样的方法,通过引用接受结构并且应该弹出模态对话框并从中填充结构的例程可以创建Holder&lt;thatStructType&gt;,将其传递给表单,然后复制数据从该持有人回到传入的参考。虽然在您的特定场景中,将数据保持事物简单地设置为类可能更好,但结构的优势在于可以知道不存在对它们的未完成引用;如果一个例程声明了一个结构并通过引用将它传递给一些外部代码,那么一旦该代码返回该结构中的值将不会改变,除非或直到例程自己写入它或通过引用传递结构到其他代码。相比之下,如果例程公开了对外部代码的类引用,则无法确定该代码可能对它做什么。

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