设置内部属性不在外部对象上更新
本文关键字:对象 更新 外部 内部 属性 设置 | 更新日期: 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要触发的新值?不。您正在设置InnerClass
的OperatorId
属性。因此,operatorId
字段永远不会得到那个值。
撇开第一部分的问题不谈,如果您想保持相同的代码并使其工作,那么这一行必须是:
test.inner = new InnerClass { OperatorId = 5 };
将inner
属性设置为具有所需OperatorId
值的InnerClass
的新实例,从而将operatorId
字段设置为适当的值。