相互更新的属性

时间:2013-02-12 21:55:40

标签: c# properties circular-reference

所以,在一些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 个答案:

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