C#プロパティ:プライベートフィールドなしでカスタムセットプロパティを使用する方法


93

私はこれをしたいです:

public Name
{
    get;
    set
    {
        dosomething();
        ??? = value
    }
}

自動生成されたプライベートフィールドを使用することはできますか?
それとも、この方法で実装する必要がありますか?

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}

2
このSOの質問では、この上の良い議論がたくさんあります:stackoverflow.com/questions/1277018/...は
デヴィッド・ホール

回答:


102

ゲッターまたはセッターのいずれかでカスタムを行う場合、自動プロパティは使用できなくなります。


37

あなたはこのようなことを試すことができます:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}

6
+1私の考えでは、この答えは受け入れられた答えを非難します。自動プロパティを使用しています。セッターを明示的にプライベートに設定します。これは、setterメソッドの背後でさらに多くの処理が行われている可能性があることをエンドユーザーまたは開発者に知らせるため、良いことです。
ooXei1sh

これとまったく設定しないことの違いは何ですか?
Sidhin S Thomas

3
@SidhinSThomasがを提供しないとprivate set、クラスのメンバーがプロパティを設定できなくなります。厳密には読み取り専用になります。コンストラクタでしかデータを設定できません。
Bondolin

15

これは不可能です。自動実装プロパティまたはカスタムコード。


11

C#7以降では、プロパティgetsetアクセサーに式本体の定義を使用できます。

詳細はこちら

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}

4
まだプライベートフィールドを使用しています。本当にOPを助けません。
TSmith

これは機能しますが、@ TSmithが言うように、それはOPが望むものではありません。
M.ルイス

7

シナリオに応じて完全に実装する必要があります。両方ともgetset自動実装するか、完全に実装する必要があります。2つの組み合わせではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.