【问题标题】:Private propertys and mutable types私有属性和可变类型
【发布时间】:2013-10-19 07:31:34
【问题描述】:

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

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

例如,更改是 - 将 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'
}

【问题讨论】:

  • 显示相关代码。
  • "when I change something" 是什么意思?请发布您的代码 - 不要让我们想象它。
  • 抱歉,添加了信息,确实没有太多代码可显示。我认为这是一种常见的情况。
  • @JJ_Jason:可能没有很多代码,但有什么是至关重要的。只显示代码比描述代码要容易得多。
  • "c2.C1 仍然是 'c1name'" 这不是真的,它会按预期变为 test。演示:ideone.com/arahIC

标签: c#


【解决方案1】:

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

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

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

【讨论】:

【解决方案2】:

在您解决问题之前,我不确定这是否是您的问题。不过……

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

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

【讨论】:

  • you will see the change also reflected in the PRIVATE property 我该如何避免这种情况?
【解决方案3】:

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

【讨论】:

  • 不需要复制对象吗?
  • 这不能回答问题(据我所知)。并且@JJ_Jason(通常)在.NET 中不需要复制对象。
猜你喜欢
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 2013-08-16
  • 2021-11-22
  • 1970-01-01
  • 2013-11-27
相关资源
最近更新 更多