设置内部属性不在外部对象上更新

时间:2016-08-26 05:58:30

标签: c# .net

以下是我的代码:

void Main()
{
    Test test = new Test();
    test.inner.OperatorId = 5;
    Console.Out.WriteLine(test.inner.OperatorId); //returns 0; Why not 5?
}

public class InnerClass
{
   public string Text { get; set; }
   public long OperatorId { get; set; }
}
// Define other methods and classes here

public class Test{
    long operatorId;
    string text;
    public InnerClass inner
   {
       get
       {
           return new InnerClass
           {
               Text = text,
               OperatorId = operatorId
           };
       }
       set
       {
           text = value.Text;
           operatorId = value.OperatorId;
       }
   }
}

为什么没有console.out返回5? c#中的类是通过引用来影响内部对象还应该影响外部类中对它的引用?我该如何解决这个问题?

注意:测试以这种方式编写是有原因的。这是一种更简单的方式来引用asp.net控件。

1 个答案:

答案 0 :(得分:3)

您的代码存在两个问题。第二个问题更多地涉及您没有看到正确值的原因。然而,他们都参与了正在发生的事情,所以值得一提两个。

问题#1:

这一行:

Console.Out.WriteLine(test.inner.OperatorId);

inner属性上调用getter,初始化它的一个新实例(每次调用getter时都会发生这种情况):

get
{
    return new InnerClass
    {
        Text = text,
        OperatorId = operatorId
    };
}  

你想尝试单身人士模式吗?如果是这种情况,您可以检查它是否为null,如果是,则初始化新实例。小心单线和线程安全。如果您在第二个问题的覆盖范围内建议修复,则将使用正确的值初始化新实例...如果您不解决此问题,则每次调用getter时都会创建一个新实例

问题#2:

第二个问题是我在发布第一部分之后在评论中提出的问题。为什么不使用设置值构建新实例?好吧,让我们来看看你如何设置5的价值:

test.inner.OperatorId = 5;

您是否将inner属性设置为新值以触发setter?不。您正在设置OperatorId的{​​{1}}属性。因此,InnerClass字段永远不会获得该值。

除了从第一部分形成问题之外,如果你想保持相同的代码并使其工作,那么该行必须是:

operatorId

这会将test.inner = new InnerClass { OperatorId = 5 }; 属性设置为具有所需inner值的InnerClass的新实例,该值会将OperatorId字段设置为适当的值。