相互更新的属性
本文关键字:属性 更新 | 更新日期: 2023-09-27 17:58:48
因此,在一些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#属性是否受到循环引用/更新的约束,就像这个例子可能引起的那样?
您可以通过直接更新隐藏字段来避免无限循环,如下所示:
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,从而消除循环。
但是。。。这通常会导致以后的维护问题。就我个人而言,我会尝试寻找一种替代设计。
C#属性是否受到循环引用/更新的约束,就像这个例子可能引起的那样?
是的。你有一个很好的,无限的循环。
这会让你感到惊讶吗?
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")
和。。您将看到这个站点的名称
为了避免无限循环,这里有一个替代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;
}
}
}