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

本文关键字:对象 更新 外部 内部 属性 设置 | 更新日期: 2023-09-27 18:04:00

我的代码如下:

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

为什么不控制台。Out return 5?c#中的类是通过引用的,所以影响内部对象也应该影响外部类对它的引用?我该如何解决这个问题?

注意:这样写test是有原因的。这是引用asp.net控件的一种更简单的方式。

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

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

问题# 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要触发的新值?不。您正在设置InnerClassOperatorId属性。因此,operatorId字段永远不会得到那个值。

撇开第一部分的问题不谈,如果您想保持相同的代码并使其工作,那么这一行必须是:

test.inner = new InnerClass { OperatorId = 5 };

inner属性设置为具有所需OperatorId值的InnerClass的新实例,从而将operatorId字段设置为适当的值。