在两个表单之间通过引用传递参数

sve*_*vit 3 c# pass-by-reference

我有两种形式(Form1和Form2).在Form1上有一个'public int i'变量,在Form1构造函数中设置为值1.然后我使用以下代码从Form1打开Form2:

Form2 f2 = new Form2(ref i);
f2.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

Form2的构造函数如下所示:

public int i;
public Form2(ref int x)
{
    InitializeComponent();
    i = x;
}
Run Code Online (Sandbox Code Playgroud)

然后我将Form2上的变量i设置为值2并关闭Form2.现在我希望Form1上的变量i具有值2(因为传递参数的'ref'关键字),但是值仍然是1.我做错了什么以及为什么ref关键字在我的示例中不起作用?

谢谢

Jon*_*eet 6

"ref"修饰符仅在构造函数调用期间产生任何差异.它只与该参数相关联......并且在构造函数完成后,该参数不再存在.

执行作业时:

i = x;
Run Code Online (Sandbox Code Playgroud)

那就是复制价值.这不是变量关联ix以任何其他方式.

作为一般经验法则:如果不更改方法/构造函数中的参数值(在示例中没有),则ref修饰符不会执行任何操作.

你无法做你想做的事情:你不能把一个字段(i在这种情况下,Form2.)作为其他变量的别名.


C. *_*oss 6

实际发生了什么.

  1. 使用名为"i"的整数成员创建object1
  2. 您将对"i"的引用传递给新的对象构造函数.对"i"的引用称为"x".
  3. 将"x"的值复制到第二个对象中的变量中,也称为"i".
  4. 您退出object2的构造函数.对object1.i的引用在这里结束.
  5. 您修改object2.i(它是object1.i的副本,但不是引用,指针或链接).object1.i未被修改.

有许多方法可以通过事件或传入将在object1和object2之间共享的对象来实现您的目标.

Class Form1
{
    Object i = new Object();
    ...
    public void DoSomething()
    {
        Form2 f = new Form2(i);
        f.Show();
    }
}
Run Code Online (Sandbox Code Playgroud)

这可能是实现您的目标的最简单方法.