5

次のようなプロパティを持つオブジェクト モデルがあります。

public class SomeModel
{
   public string SomeString { get; set; }

   public void DoSomeWork()
   {
      ....
   }
}

プロパティの変更DoSomeWork後に関数を自動的に実行したい。SomeString私はこれを試しましたが、うまくいきません:

public string SomeString { get; set { DoSomeWork(); } }

正しい構文は何ですか?

4

5 に答える 5

12

このように、代わりにプライベートフィールドを使用してください...

public class SomeModel
{
    private string someString = "";

    public string SomeString {
        get { return this.someString; }
        set {
            this.someString = value;
            this.DoSomeWork();
        }
    }

   public void DoSomeWork()
   {
      ....
   }
}
于 2013-02-11T14:10:59.320 に答える
3

自動プロパティではこれを行うことはできません。フィールドに基づく「手動」プロパティを作成する必要があります。

private string _someString;

public string SomeString
{ 
   get { return _someString; }
   set 
   {
        _someString = value;
        DoSomeWork();
   }
}

このボイラープレートを本当に処理できない場合 (たとえば、これを何百回も実行する必要があるとします)、PostSharp などの AOP フレームワークを使用してこれ実装することを検討してください。自動プロパティと属性を使用して、目的のスキームを実装するバイナリ リライターを取得します。

于 2013-02-11T14:11:19.493 に答える
2

これは動作します...

private string _someString;
public string SomeString { get { return _someString; } set { _someString = value; DoSomeWork(); } }
于 2013-02-11T14:11:32.990 に答える
1
private string _someString;

public string SomeString
{
    get
    {
       return _someString;
    }
    set 
    {
       DoSomeWork();
       _someString = value;
    }
}
于 2013-02-11T14:12:09.060 に答える
0

C#チームは、C#3.0で自動実装プロパティを導入しました。コンパイラによって作成された匿名フィールドに裏打ちされたモデル作成を最小化するロジックを使用します。これは、オブジェクトクラスのプロパティに追加のロジックを実装する必要がない場合に使用されます。だからそれはちょうど続いた。

public string Name{ get; set;}// auto-implemented property. no additional logic.

1つの関数を追加したいので、ロジックを追加したい場合。以下のように、プライベートフィールドに裏打ちされた手動プロパティを作成する必要があります。

private string _Name;
public string Name
{
  get {return _Name;}
 set {
        _Name=value;
        DoSomething(); //Additional logic implemented.
     }
}
于 2013-02-11T14:40:28.810 に答える