2

したがって、一部のC#コードでは、2つのプロパティに似たものがあります。

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の答えに代わる方法があります。値が実際に変更された場合にのみ、セッター行を実行します。優しくしてください。これは私の最初の投稿/回答です

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 に答える