C# 通过引用和值传递WinForm的结果

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方法创建

我有一个名为Form1的win表单窗口- 一个名为Label1的标签, 两个按钮分别命名为button1和button2

当我点击按钮1时,它会创建一个名为f的Form1类型的新窗口, 与当前窗口无关,即此(表格1), f是发送给名为ChangeByReference作为引用的方法的

ChangeByReference方法更改窗体的文本、Label1的文本和前景色,即 参照传递

当我单击button2时,这个实例方法将ChangeByValue命名为value

ChangeByValue方法创建一个新窗口,并初始化为Form1的默认构造函数, 然后将其设置为参数valForm,我更改了一些属性,最后使用 显示方法

现在的问题是为什么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
对象,但在将局部变量重新分配给参数值之后。这样,新对象将不再使用(您将其“扔掉”)。接下来的几行代码实际上是在更改/设置通过参数提供的表单的属性。在这种情况下(即将到来)