[英]change object but not reference c#
MainClass有一个Data对象。 要创建Class2,我必须将MainData赋予Class2 。 在Class2中有一个Load函数,用于从文件加载Data对象。 因此MainData对象应该更改为新对象。
在Class2中,Data对象被绑定到控件。
这是一个简单的例子:
class MainClass {
public Data Maindata { get; set; }
private Class2 cla;
public MainClass() {
Maindata = new Data();
Maindata.Name = "Maindata";
Console.WriteLine("Class1.MainData = " + Maindata.Name);
cla = new Class2(Maindata);
//Here should Maindata.Name = newData
Console.WriteLine("Class1.MainData = " + Maindata.Name);
}
}
class Class2 {
public Data data { get; set; }
public Class2(Data maindata) {
data = maindata;
changeData();
Console.WriteLine("Class2.Data = "+data.Name);
}
private void changeData() {
Data test = new Data();
test.Name = "newData";
data = test;
}
}
class Data {
public string Name { get; set; }
}
我知道你可以通过做data.Name =“newData”来改变它; 但如果Data拥有超过100个属性,那就是Overkill;
您可以更改现有对象,而不是创建新对象:
private void changeData() {
data.Name = "newData";
}
如果要创建新对象,则需要使Class2
知道MainClass
以便它可以更改属性:
public Class2(MainClass main) {
changeData();
main.Maindata = data;
Console.WriteLine("Class2.Data = "+data.Name);
}
并使用称它为MainClass
对象,而不是Maindata
对象:
cla = new Class2(this);
虽然我会质疑“你为什么要这样做?”,但是关于如何将构造函数中新创建的对象传递给调用它的方法的具体问题的答案将使用“out”关键字完成:
public Class2(out Data maindata)
{
changeData();
maindata = data;
}
private Data changeData()
{
Data test = new Data();
test.Name = "newData";
data = test;
}
这一切都在做:
private void changeData() {
Data test = new Data();
test.Name = "newData";
data = test; //assign the new object to the property data in Class2
}
分配给Class2
属性data
的行为与MainClass
的MainData
属性MainData
。
此代码将影响共享的Data
对象:
private void changeData() {
data.Name = "newData";
}
你可以这样做:
class Class2 {
public Data data { get; set; }
public Class2(ref Data maindata) {
data = maindata;
changeData();
maindata = data;
Console.WriteLine("Class2.Data = "+data.Name);
}
private void changeData() {
Data test = new Data();
test.Name = "newData";
data = test;
}
}
经过裁判的关键字MainData
将适用的变化maindata
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.