2012-01-03 48 views
15

自動実装されたプロパティを使用したいが、同時にプロパティが変更されるたびにメソッドを呼びたい。自動プロパティのC#で設定をオーバーライドする方法

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

上記のコードはプロパティへの再帰呼び出しを行いますか?もしそうなら、これを実装する方法は?

+6

C#ではこれを行うことはできません。バッキングフィールドを使用する必要があります。 –

+2

答えはYESです....それは連続的なループを作ります。 –

+2

@UweKeim、それは答えでなければなりません。 – driis

答えて

22

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

private float _inverseMass; 

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

これは残念です。自動プロパティを作成するのではなく、 'value'のような一般的な事前定義された単語を使用するといいでしょう。 –

4

これはC#では実行できません。

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

8

ではなく、バッキングフィールドを使用します。

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

private float _inverseMass; 

私は一度C#の男は、彼らがそれらの自動プロパティで使用シナリオの幅広いをカバーしたいと決めたことをどこかで読んますが、特別な場合のためにあなたが行かなければなりません良い古いバッキングフィールドに戻ります。

(正直に言うと、私はジョンスキートはそれらを実装する方法を彼らに言ったことを信じて)

4

あなたは再帰的な問題を得ることはありませんので、プライベート/パブリックメンバーに上記を抜け出す必要があるでしょう:

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"); } 
    } 
} 
1

これはコンパイルされないため、再帰的かどうかは分かりません。

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

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

ものの、PostSharpようaspected指向プログラミングフレームワークは、これであなたを助けることができるかもしれません。

0

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

private float inverseMass; 

public float InverseMass{ 

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

} 
-2
public float inverseMass 
{ 
    get; 
    set 
    { 
     if (inverseMass != value) 
     { 
      inverseMass = value; 
      onMassChanged(); 
     } 
    } 
} 
+0

ここで何を言おうとしていますか?この答えはコンパイルされません。 – vcsjones

1

正解は、上で示されているが、あなたは、Visual Studioですぐにこれをやってみたかった場合には、あなたはあなたのためのプロパティを生成する代わりに、コードスニペットを使用することができます。

は少し良くそれを説明する必要があります。この記事の読み取りを持っている:http://www.roelvanlisdonk.nl/?p=1007

必要であれば、あなたも反復コードを追加するために、独自のコードスニペットを作成することができます。上記のようにINotifyPropertyChanged実装を迅速に生成するためにも使用できます。

関連する問題