web-dev-qa-db-ja.com

自動プロパティのC#で設定をオーバーライドする方法

自動実装されたプロパティを使用したいのですが、同時に、プロパティが変更されるたびにメソッドを呼び出したいと思っています。

public float inverseMass
{
    get;
    set
    {
        onMassChanged();
        inverseMass = value;
    }
}

前のコードはプロパティを再帰的に呼び出しますか?もしそうなら、これをどのように実装するのですか?

24
MhdSyrwan

独自のget/setを提供する場合は、変数に独自のストレージを提供する必要があります。

private float _inverseMass;

public float inverseMass
{
    get { return _inverseMass; }
    set
    {
        _inverseMass = value;
        onMassChanged();
    }
}
27
Gary

代わりにバッキングフィールドを使用します。

public float inverseMass
{
    get
    {
        return _inverseMass;
    }
    set
    {
        onMassChanged();
        _inverseMass = value;
    }
}

private float _inverseMass;

C#の連中が、これらの自動プロパティを使用して幅広い使用シナリオをカバーすることを決定したとどこかで読んだことがありますが、特別な場合には、古き良きバッキングフィールドに戻る必要があります。

(正直に言うと、ジョンスキートが実装方法を教えたと思います)

8
Uwe Keim

再帰的な問題が発生しないように、上記をプライベート/パブリックメンバーに分割する必要があります。

private float _inverseMass;
public float inverseMass
{
  get { return this._inverseMass; }
  set { this._inverseMass = value; onMassChanged(); }
}

しかし、 INotifyPropertyChanged インターフェースを調べましたか?それはあなたが探していることのほとんどをします、そしてあなたが書いているものに依存して、それはネイティブでサポートされることができました。

public class MyClass : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;
  private void NotifyPropertyChanged(String property)
  {
    var event = this.PropertyChanged;
    if (event != null)
    {
      event(this, new PropertyChangedEventArgs(property));
    }
  }

  private float _inverseMass;
  public float inverseMass
  {
    get { return this._inverseMass; }
    set { this._inverseMass = value; NotifyPropertyChanged("inverseMass"); }
  }
}
5
Brad Christie

C#ではそれはできません。

自動プロパティまたはバッキングフィールドを持つプロパティ。

4
Euphoric

それはコンパイルされないので、それが再帰的であるかどうかを言うのは難しいです。

自動プロパティの一部のみを指定することはできません。この場合、バッキングフィールドを使用する必要があります。

private float _inverseMass;
public float inverseMass 
{ 
    get { return _inverseMass; }
    set 
    { 
        onMassChanged(); 
        _inverseMass = value; 
    } 
}

ただし、 PostSharp のようなアスペクト指向プログラミングフレームワークは、これを支援することができる場合があります。

1
vcsjones

正しい答えは上記のとおりですが、Visual Studioでこれをすばやく実行したい場合は、代わりにコードスニペットを使用してプロパティを生成できます。

少し良く説明しているはずのこの記事を読んでください: http://www.roelvanlisdonk.nl/?p=1007

必要に応じて、独自のコードスニペットを作成して、反復的なコードを追加することもできます。これを使用して、上記のようにINotifyPropertyChanged実装をすばやく生成することもできます。

1
Richard

パブリックプロパティのバックアップフィールドとしてプライベート変数を使用します。

private float inverseMass;

public float InverseMass{

   set
   {
        onMassChanged();
        inverseMass=value;
   }
   get
   {
      return inverseMass;
   }

}
0
Shyju