我有一个困惑,当我在另一个类的构造函数中通过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/