更改对象但不更改引用c#
MainClass有一个数据对象。 要创建Class2,我必须将MainData提供给Class2。 在Class2中有一个Load函数,它从文件中加载数据对象。因此,MainData对象应更改为新对象 在Class2中,数据对象绑定到控件 这是一个简单的例子:更改对象但不更改引用c#,c#,.net,data-binding,reference,C#,.net,Data Binding,Reference,MainClass有一个数据对象。 要创建Class2,我必须将MainData提供给Class2。 在Class2中有一个Load函数,它从文件中加载数据对象。因此,MainData对象应更改为新对象 在Class2中,数据对象绑定到控件 这是一个简单的例子: class MainClass { public Data Maindata { get; set; } private Class2 cla; public MainClass() { Main
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来更改它;
但如果数据的属性超过100个,那就太过分了 您可以更改现有对象,而不是创建新对象:
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);
private void changeData() {
data.Name = "newData";
所有这些都在做:
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
属性无关
此代码将影响共享的数据对象:
cla = new Class2(this);
private void changeData() {
data.Name = "newData";
}当我问“你到底为什么要这样做?”时,关于如何在构造函数中向调用它的方法传递新创建的对象的特定问题的答案将使用“out”关键字完成:
你可以这样做:
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;
}
}
通过ref关键字MainData
将应用MainData
的更改。为什么要传递MainData?您的目标是在两行之后创建新数据?无论如何,您要查找的是“out”关键字,因为有一个加载函数将文件反序列化为数据对象。数据对象具有100多个属性。类2中的数据对象绑定到视图中的控件,因为有一个加载函数将文件反序列化到数据对象。数据对象具有100多个属性。Class2中的数据对象绑定到视图中的控件。是的,我考虑过,但是没有更好的方法来实现这一点。这不会占用很多内存/空间吗?@Sam_vdd-不,它不会,它会传递一个指向MainClass
对象的指针,它不会复制。因此,将指针传递到数据
对象在内存方面没有什么不同。但是,即使它确实占用了更多的空间,也不要过早地进行优化-首先让它工作,然后才能确定需要优化的内容。好的,但是我如何从另一个函数获取ref Data main Data?