C# 通过引用和值传递WinForm的结果
我有一个名为Form1的win表单窗口- 一个名为Label1的标签, 两个按钮分别命名为button1和button2 当我点击按钮1时,它会创建一个名为f的Form1类型的新窗口, 与当前窗口无关,即此(表格1), f是发送给名为ChangeByReference作为引用的方法的 ChangeByReference方法更改窗体的文本、Label1的文本和前景色,即 参照传递 当我单击button2时,这个实例方法将ChangeByValue命名为value ChangeByValue方法创建一个新窗口,并初始化为Form1的默认构造函数, 然后将其设置为参数valForm,我更改了一些属性,最后使用 显示方法 现在的问题是为什么ChangeByValue方法调用正在破坏原始窗口 显示新表单,因为它的参数是通过值传递的C# 通过引用和值传递WinForm的结果,c#,winforms,data-structures,C#,Winforms,Data Structures,我有一个名为Form1的win表单窗口- 一个名为Label1的标签, 两个按钮分别命名为button1和button2 当我点击按钮1时,它会创建一个名为f的Form1类型的新窗口, 与当前窗口无关,即此(表格1), f是发送给名为ChangeByReference作为引用的方法的 ChangeByReference方法更改窗体的文本、Label1的文本和前景色,即 参照传递 当我单击button2时,这个实例方法将ChangeByValue命名为value ChangeByValue方法创建
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Text = "Original Window";
}
public void ChangeByReference(ref Form1 refForm)
{
Form1 f = refForm;
f.label1.Text = "This is changed by Reference";
f.label1.ForeColor = Color.Aquamarine;
}
public void ChangeByValue(Form1 valForm)
{
Form1 f = new Form1();
f = valForm;
f.Text = "Changed Window";
f.label1.Text = "This is changed by Value";
f.label1.ForeColor = Color.Red;
f.Show();
}
private void button1_Click(object sender, EventArgs e)
{
Form1 f = this as Form1;
ChangeByReference(ref f);
}
private void button2_Click(object sender, EventArgs e)
{
ChangeByValue(this);
}
}
方法
ChangeByReference
实际上并不需要ref
。您没有使用ref
的“功能”。我认为您混合了两个概念,一个是“引用类型”,第二个是“将参数作为引用传递”。此外,根据文件:
不要混淆引用传递的概念和引用类型的概念。这两个概念不一样。方法参数可以由ref修改,而不管它是值类型还是引用类型。通过引用传递值类型时,不存在值类型的装箱
资料来源:
在代码中,只需更改作为参数传递的表单的某些属性。无论是否将参数指定为ref
,效果都相同
在第二种方法ChangeByValue
中,首先初始化一个新的Form1
对象,但在将局部变量重新分配给参数值之后。这样,新对象将不再使用(您将其“扔掉”)。接下来的几行代码实际上是在更改/设置通过参数提供的表单的属性。在这种情况下(来自按钮2\u单击
事件),您正在更改当前表单
一篇有趣的文章:(作者:Jon Skeet)。方法
ChangeByReference
实际上并不需要ref
。您没有使用ref
的“功能”。我认为您混合了两个概念,一个是“引用类型”,第二个是“将参数作为引用传递”。此外,根据文件:
不要混淆引用传递的概念和引用类型的概念。这两个概念不一样。方法参数可以由ref修改,而不管它是值类型还是引用类型。通过引用传递值类型时,不存在值类型的装箱
资料来源:
在代码中,只需更改作为参数传递的表单的某些属性。无论是否将参数指定为ref
,效果都相同
在第二种方法ChangeByValue
中,首先初始化一个新的Form1
对象,但在将局部变量重新分配给参数值之后。这样,新对象将不再使用(您将其“扔掉”)。接下来的几行代码实际上是在更改/设置通过参数提供的表单的属性。在这种情况下(来自按钮2\u单击
事件),您正在更改当前表单
一篇有趣的文章:(作者:Jon Skeet)。方法
ChangeByReference
实际上并不需要ref
。您没有使用ref
的“功能”。我认为您混合了两个概念,一个是“引用类型”,第二个是“将参数作为引用传递”。此外,根据文件:
不要混淆引用传递的概念和引用类型的概念。这两个概念不一样。方法参数可以由ref修改,而不管它是值类型还是引用类型。通过引用传递值类型时,不存在值类型的装箱
资料来源:
在代码中,只需更改作为参数传递的表单的某些属性。无论是否将参数指定为ref
,效果都相同
在第二种方法ChangeByValue
中,首先初始化一个新的Form1
对象,但在将局部变量重新分配给参数值之后。这样,新对象将不再使用(您将其“扔掉”)。接下来的几行代码实际上是在更改/设置通过参数提供的表单的属性。在这种情况下(来自按钮2\u单击
事件),您正在更改当前表单
一篇有趣的文章:(作者:Jon Skeet)。方法
ChangeByReference
实际上并不需要ref
。您没有使用ref
的“功能”。我认为您混合了两个概念,一个是“引用类型”,第二个是“将参数作为引用传递”。此外,根据文件:
不要混淆引用传递的概念和引用类型的概念。这两个概念不一样。方法参数可以由ref修改,而不管它是值类型还是引用类型。通过引用传递值类型时,不存在值类型的装箱
资料来源:
在代码中,只需更改作为参数传递的表单的某些属性。无论是否将参数指定为ref
,效果都相同
在第二种方法ChangeByValue
中,首先初始化一个新的Form1
对象,但在将局部变量重新分配给参数值之后。这样,新对象将不再使用(您将其“扔掉”)。接下来的几行代码实际上是在更改/设置通过参数提供的表单的属性。在这种情况下(即将到来)