現在自動化されているプロパティがあります。
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
が使用されているので、私はむしろしたくない
バッキングフィールドを持つプロパティを使用する必要があります。
private string mMyProperty;
public string MyProperty
{
get { return mMyProperty; }
set
{
mMyProperty = value;
PerformSomeAction();
}
}
自動生成されたプロパティの場合に自動生成される(非表示の)バッキングフィールドを参照するため、一方を他方なしで実装することはできません。ただし、実装する場合は、このバッキングフィールドを両方の方法で設定する必要があります。
自動ウェイはこれに対する単なるショートカットです:
private string _property;
public string MyProperty
{
get { return _property; }
set { _property = value; }
}
したがって、メソッドの1つで非表示フィールドを省略した場合(これが実際のゲッターとセッターです)、このメソッドは値を格納/取得する方法をどのように知る必要がありますか?
ゲッターとセッターの両方にボディを提供するか、どちらも提供しない必要があります。
したがって、どちらかを定義すると、それは自動プロパティではなくなります。
だからあなたはしなければなりません:
どちらか
public string MyProperty {
get;
set;
}// Automatic property, no implementation
OR
public string MyProperty
{
get { return mMyProperty; }
set
{
mMyProperty = value;
PerformSomeAction();
}
}
これは質問 C#ゲッターとセッターの省略形 に似ています。
セッターを手動で指定すると、ゲッターの自動プロパティメカニズムは使用されません。そのため、エラーメッセージは欠落しているように動作します。セッターを指定するときは、独自のゲッターを作成する必要があります。
セッターで何かをしている場合は、変数を明示的に宣言する必要があります。例えば。
_private string _myProperty;
public string MyProperty {
get { return _myProperty; };
set
{
_myProperty = value;
PerformSomeAction();
}
}
_
または-セッターで、関数に値を渡して、そこでやりたいことを実行できます...関数の値を変更/チェックしたい場合はPerformSomeAction()