Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改对象但不更改引用c#_C#_.net_Data Binding_Reference - Fatal编程技术网

更改对象但不更改引用c#

更改对象但不更改引用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

MainClass有一个数据对象。 要创建Class2,我必须将MainData提供给Class2。 在Class2中有一个Load函数,它从文件中加载数据对象。因此,MainData对象应更改为新对象

在Class2中,数据对象绑定到控件

这是一个简单的例子:

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?