2

所以,在一些 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# 属性是否受到循环引用/更新的影响,就像这个例子似乎会导致?

4

4 回答 4

3

您可以通过直接更新隐藏字段来避免无限循环,如下所示:

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;
   }
}

这将绕过另一个属性的设置器,从而消除循环。

但是……这通常会导致以后的维护问题。就个人而言,我会尝试寻找替代设计。

于 2013-02-12T22:04:00.620 回答
2

C# 属性是否受到循环引用/更新的影响,就像这个例子似乎会导致?

是的。你在这里有一个很好的无限循环。

于 2013-02-12T21:57:25.923 回答
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")和..你会看到这个网站的名字

于 2013-02-12T22:01:42.770 回答
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;
      }
   }
}
于 2013-07-05T06:32:17.367 回答