我有一个困惑,当我在另一个类的构造函数中通过refrence传递变量,并在通过refrence传递该对象之后,我用new关键字重新创建了refrence对象。

现在,我在其中通过了受版权保护的对象的课程无法反映更新的数据。
下面是上述问题的例证:

Refrence传递的对象:

public class DummyObject
{
    public string Name = "My Name";

    public DummyObject()
    { }
}


正在通过Refreence的类:

public partial class Form1 : Form
{
    // Object to be passed as refrence
    DummyObject dummyObject = new DummyObject();

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // assigning value
        dummyObject.Name = "I am Dummy";

        // Passing object
        Form2 frm = new Form2(ref dummyObject);
        frm.Show();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        // Displaying Name
        MessageBox.Show(this.dummyObject.Name);
    }

    private void button3_Click(object sender, EventArgs e)
    {
        // Assigning new object
        this.dummyObject = new DummyObject();

        // Changing Name Variable
        this.dummyObject.Name = "I am Rechanged";

        // Displaying Name
        MessageBox.Show(this.dummyObject.Name);
    }
}


引用将对象传递给的类:

public partial class Form2 : Form
{
    private DummyObject dummyObject = null;

    public Form2(ref DummyObject DummyObject)
    {
        InitializeComponent();

        this.dummyObject = DummyObject;
        this.dummyObject.Name = "I am Changed";
    }

    private void button2_Click(object sender, EventArgs e)
    {
        MessageBox.Show(this.dummyObject.Name);
    }
}


当我在窗体1中重新分配对象并在窗体2中显示其值时,它仍显示“我被更改”而不是“我被更改”。

如何保持数据同步?

最佳答案

您不能以这种方式使变量保持同步。没有ref实例或静态变量的概念,只有ref参数。 dummyObject实例变量确实(并且将始终)代表不同的内存插槽。您要做的只是将值从DummyObject参数复制到dummyObject;您不会做任何会因参数是否声明为ref而受到影响的操作。

典型的方法是将dummyObject的值公开为Form2的属性。

public DummyObject DummyObject
{
    get { return dummyObject; }
    set
    {
        dummyObject = value;

        // any other code, if any, that might need to execute
        // when the value is changed
    }
}


但这意味着您需要保留Form2实例,以便可以更改属性的值。

另一个选择,尽管有些令人费解,但是将传递一个包含该属性的包装器类,而不是将其添加到表单中。

public class DummyWrapper
{
    public DummyObject DummyObject { get; set; }
}


然后,您可以更改表单以使用DummyWrapper而不是DummyObject,然后在要获取或设置值时访问dummyWrapper.DummyObject属性。只要您仅更改DummyWrapper.DummyObject属性的值而不更改DummyWrapper的实际值,那么您将指向同一实例。

例如:

public partial class Form2 : Form
{
    private DummyWrapper dummyWrapper = null;

    public Form2(DummyWrapper dummyWrapper)
    {
        InitializeComponent();

        this.dummyWrapper = dummyWrapper;
        this.dummyWrapper.DummyObject.Name = "I am Changed";
    }

    private void button2_Click(object sender, EventArgs e)
    {
        MessageBox.Show(this.dummyWrapper.DummyObject.Name);
    }
}

关于c# - C#ref混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2738618/

10-11 15:20