相互更新的属性

本文关键字:属性 更新 | 更新日期: 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#属性是否受到循环引用/更新的约束,就像这个例子可能引起的那样?

是的。你有一个很好的,无限的循环。

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")和。。您将看到这个站点的名称

为了避免无限循环,这里有一个替代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;
      }
   }
}