0

我在可变类型的类属性上有一个私有设置器,我使用 myMutableVariable.

但是,当我更改某些内容时myMutableVariableafter Class.Property = myMutableVariable,两者之间存在差异myMutableVariableand Class.Property

例如,Changin 是 - 将 myVariable 设置为 null。

该属性仍然private- 不会改变。即使对于同一私有财产中的列表及其成员也是如此。

这是如何运作的?

public class Class1
{
    public Class1(string name)
    {
        this._name = name;
    }

    private string _name = "";
    public string Name { get { return _name; } set { _name = value; } }
}

public class Class2
{
    public Class2(Class1 c1)
    {
        this._c1 = c1;
    }

    private Class1 _c1;
    public Class1 C1 { get { return _c1; } }
}

考试:

static void Main(string[] args)
{
    Class1 myMutableVariable = new Class1("c1name");


    Class2 c2 = new Class2(myMutableVariable);
    myMutableVariable = null;

    Console.WriteLine(c2.C1.Name);
    //c2.C1 remains 'c1name'
}
4

3 回答 3

5

默认情况下,方法和构造函数的所有参数都按值传递而不是按引用传递。Class2 构造函数正在复制Class1传递给它的引用。变量的值myMutableVariable是对对象的引用。该引用被复制到新Class2实例。 c2现在不再关心myMutableVariable变量发生了什么,它只关心引用引用的对象发生了什么。

如果您修改了引用的对象myMutableVariable而不是变量本身,那么您会看到它反映在c2实例中。例如,myMutableVariable.Name = "new name";将导致打印不同的名称。

这是按值传递引用与按引用传递值之间区别的核心。

于 2013-10-18T23:31:34.057 回答
1

在您解决问题之前,我不确定这是否是您的问题。然而...

如果myVariable值类型而不是引用类型,那么在分配它时,实际值数据存储在其自己的内存分配中。当您更改私有变量的值时,它不会更改公共属性的值,因为它有自己的内存分配。

如果myVariable引用类型,则您正在分配一个指向另一个保存数据的内存位置的指针。然后,如果您更改私有变量的对象,您将看到更改也反映在公共属性中,因为它仍然指向同一个对象。

于 2013-10-18T22:47:32.933 回答
0

private只是意味着只有包含类及其成员才能访问代码。所以Class.Property只能在类中设置(如果它是对象,则引用对象)。

于 2013-10-18T22:38:42.357 回答