【问题标题】:C# - Pass a struct to a form by reference and return value?C# - 通过引用和返回值将结构传递给表单?
【发布时间】:2011-12-02 20:39:17
【问题描述】:

我有一个结构:

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 完成处理值时将更新的结构值返回给 Form1?

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

【问题讨论】:

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


    【解决方案1】:

    有时有用的一种模式是定义一个类,如下所示:

    类 Holder {公共 T 值;}

    这样的类可以使用需要引用类型的代码来传递和改变值类型。使用这种方法,通过引用接受结构并应该弹出模式对话框并从中填充结构的例程可以创建Holder<thatStructType>,将其传递给表单,然后从中复制数据持有人返回传入的引用。虽然在您的特定场景中,将数据保存的东西简单地作为一个类可能会更好,但结构的优点是人们可以知道不存在对它们的突出引用;如果例程声明了一个结构并通过引用某些外部代码来传递它,那么一旦该代码返回该结构中的值,除非或直到例程自己编写它们或通过引用其他代码来传递该结构,否则该结构中的值将不会改变。相比之下,如果例程将类引用公开给外部代码,则无法知道该代码可以用它做什么。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-09-22
        • 2018-01-18
        • 2015-11-14
        • 2013-05-12
        • 2011-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多