C# 私有属性和可变类型

C# 私有属性和可变类型,c#,C#,我在可变类型的类属性上有一个私有setter,我使用myMutableVariable通过类构造函数设置它 但是,当我在myMutableVariableafterClass.Property=myMutableVariable之后更改myMutableVariableand和Class.Property之间存在差异 例如,Changin正在将myVariable设置为null 属性仍然是私有的,不会更改。 即使对于同一私有属性中的列表及其成员也是如此 这是怎么回事 public class C

我在可变类型的类属性上有一个私有setter,我使用
myMutableVariable
通过类构造函数设置它

但是,当我在
myMutableVariableafter
Class.Property=myMutableVariable
之后更改
myMutableVariableand
Class.Property
之间存在差异

例如,Changin正在将myVariable设置为null

属性仍然是私有的,不会更改。 即使对于同一私有属性中的列表及其成员也是如此

这是怎么回事

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'
}

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

private
仅表示只有包含类及其成员才能访问代码。因此,只能在类中设置
Class.Property
(如果对象是对象,则为对象的引用)。

在您澄清问题之前,我不确定这是否是您的问题。然而

如果
myVariable
是一个变量,那么在分配它时,实际值数据存储在它自己的内存分配中。更改私有变量的值时,它不会更改公共属性的值,因为它有自己的内存分配

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

在您澄清问题之前,我不确定这是否是您的问题。然而

如果
myVariable
是一个变量,那么在分配它时,实际值数据存储在它自己的内存分配中。更改私有变量的值时,它不会更改公共属性的值,因为它有自己的内存分配


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

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

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


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

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

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


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

显示相关代码。
“当我更改某个内容时”
意味着什么?请张贴您的代码-不要让我们想象。对不起,添加了信息,没有太多的代码显示。我想这是一种常见的情况。@JJ_Jason:代码可能不多,但关键是什么。只显示代码要比描述代码容易得多。“c2.C1仍然是‘c1name’”这不是真的,它会像预期的那样变成
test
。演示:显示相关代码。
“当我更改某些内容时”
是什么意思?请张贴您的代码-不要让我们想象。对不起,添加了信息,没有太多的代码显示。我想这是一种常见的情况。@JJ_Jason:代码可能不多,但关键是什么。只显示代码要比描述代码容易得多。“c2.C1仍然是‘c1name’”这不是真的,它会像预期的那样变成
test
。演示:这不需要复制对象吗?这并没有回答问题(据我所知)。和@JJ_Jason,.NET中(通常)不需要复制对象。这不需要复制对象吗?这并不能回答问题(据我所知)。和@JJ_Jason,.NET中(通常)不需要复制对象。
您将看到私有属性中也反映了更改
如何避免这种情况?
您将看到私有属性中也反映了更改
如何避免这种情况?实际上,这回答了我最初的问题:实际上,这回答了我原来的问题: