私有属性和可变类型
本文关键字:类型 属性 | 更新日期: 2023-09-27 18:36:04
我在可变类型的类属性上有一个私有资源库,我使用 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'
}
默认情况下,方法和构造函数的所有参数都是按值传递的,而不是按引用传递的。 Class2 构造函数正在复制对传入其中Class1
的引用。 myMutableVariable
变量的值是对对象的引用。 该引用将复制到新的Class2
实例。 c2
现在不再关心myMutableVariable
变量会发生什么,它只关心引用引用的对象会发生什么。
如果您修改了myMutableVariable
引用的对象而不是变量本身,那么您会看到它反映在c2
实例中。 例如,myMutableVariable.Name = "new name";
将导致打印不同的名称。
这是按值传递引用与按引用传递值之间区别的核心。
我不确定这是否是您的问题,直到您清除问题。 然而。。。
如果myVariable
是值类型而不是引用类型,则在分配它时,实际值数据存储在其自己的内存分配中。 当您更改私有变量的值时,它不会更改公共属性的值,因为它有自己的内存分配。
如果myVariable
是引用类型,则正在分配指向保存数据的另一个内存位置的指针。 然后,如果您更改私有变量的对象,您将看到更改也反映在公共属性中,因为它仍然指向同一对象。
private
只是意味着只有包含的类及其成员可以访问代码。 因此Class.Property
只能在类中设置(如果它是对象,则对对象的引用)。