以下是我的代码:
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控件。
答案 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
字段设置为适当的值。