所以,在一些C#代码中,我有两个类似的东西:
private string _foo;
private string _bar;
public Foo
{
get;
set {
_foo = value;
Bar = _foo.Substring(3, 5);
}
}
public Bar
{
get;
set {
_bar = value;
Foo = "XXX" + _bar;
}
}
问题:C#属性是否受循环引用/更新的影响,如此示例似乎会导致?
答案 0 :(得分:2)
C#属性是否受循环引用/更新的约束,如此示例似乎会导致?
是。你在这里有一个很好的无限循环。
答案 1 :(得分:2)
您可以通过直接更新隐藏字段来避免无限循环,如下所示:
private string _foo;
private string _bar;
public string Foo
{
get { return _foo; }
set {
_foo = value;
_bar = _foo.Substring(3, 5);
}
}
public string Bar
{
get { return _bar; }
set {
_bar = value;
_foo = "XXX" + _bar;
}
}
这会绕过另一个属性的setter,从而消除了循环。
但 ...这通常会导致以后的维护问题。就个人而言,我试图找到另一种设计。
答案 2 :(得分:1)
C#中的属性是简单的方法(getter和setter)。您从其他方法调用一个方法,反之亦然。完全可以预料到结果。
这会让你感到惊讶吗?
public void set_Foo(string value)
{
set_Bar(value.Substring(3, 5));
}
public void set_Bar(string value)
{
set_Foo("XXX" + value);
}
致电set_Foo("XXX12345")
并且..您将看到此网站的名称
答案 3 :(得分:1)
为了避免无限循环,这里是Philip Hanson的答案的替代方案:仅在值实际变化时运行setter线。对人好点;这是我的第一篇帖子/答案
private string _foo;
private string _bar;
public Foo
{
get;
set {
if (_foo != value)
{
_foo = value;
Bar = _foo.Substring(3, 5);
}
}
}
public Bar
{
get;
set {
if (_bar != value)
{
_bar = value;
Foo = "XXX" + _bar;
}
}
}