web-dev-qa-db-ja.com

体のないゲッター、セッター

現在自動化されているプロパティがあります。

public string MyProperty { get; set; }

ただし、変更するたびに何らかのアクションを実行する必要があるため、セッターにロジックを追加したいと思います。だから私は次のようなことをしたい:

public string MyProperty {
    get;
    set { PerformSomeAction(); }
}

ただし、これはビルドされません... MyProperty.get' must declare a body because it is not marked abstract, extern, or partial

ゲッターにMyPropertyを返すだけでは、無限ループが発生します。

これを行う方法はありますか、それとも参照するプライベート変数を宣言する必要がありますか?このクラスとその外部の両方でコード全体でMyPropertyが使用されているので、私はむしろしたくない

17
colmde

バッキングフィールドを持つプロパティを使用する必要があります。

private string mMyProperty;
public string MyProperty
{
    get { return mMyProperty; }
    set
    {
        mMyProperty = value;
        PerformSomeAction();
    }
}
18
Marius

自動生成されたプロパティの場合に自動生成される(非表示の)バッキングフィールドを参照するため、一方を他方なしで実装することはできません。ただし、実装する場合は、このバッキングフィールドを両方の方法で設定する必要があります。

自動ウェイはこれに対する単なるショートカットです:

private string _property;
public string MyProperty
{
    get { return _property; }
    set { _property = value; }
}

したがって、メソッドの1つで非表示フィールドを省略した場合(これが実際のゲッターとセッターです)、このメソッドは値を格納/取得する方法をどのように知る必要がありますか?

5
HimBromBeere

ゲッターとセッターの両方にボディを提供するか、どちらも提供しない必要があります。

したがって、どちらかを定義すると、それは自動プロパティではなくなります。

だからあなたはしなければなりません:

どちらか

public string MyProperty {
    get;
    set;
}// Automatic property, no implementation

OR

public string MyProperty
{
    get { return mMyProperty; }
    set
    {
        mMyProperty = value;
        PerformSomeAction();
    }
}
1
Vishal Suthar

これは質問 C#ゲッターとセッターの省略形 に似ています。

セッターを手動で指定すると、ゲッターの自動プロパティメカニズムは使用されません。そのため、エラーメッセージは欠落しているように動作します。セッターを指定するときは、独自のゲッターを作成する必要があります。

0
Trevor

セッターで何かをしている場合は、変数を明示的に宣言する必要があります。例えば。

_private string _myProperty;
public string MyProperty {
    get { return _myProperty; };
    set 
    {
        _myProperty = value; 
        PerformSomeAction(); 
    }
}
_

または-セッターで、関数に値を渡して、そこでやりたいことを実行できます...関数の値を変更/チェックしたい場合はPerformSomeAction()

0
Percy