web-dev-qa-db-ja.com

.NETでのゲッターとセッターの宣言

私は、これらのゲッターとセッターの宣言の違いは何か、そして好ましい方法があるかどうか(そしてその理由)は疑問に思いました。最初のものはVisual Studioによって自動的に生成されます。他の人はどうですか?ありがとう

1日

string _myProperty { get; set; }

第二

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

3日

string _myProperty;

public string getMyProperty()
{
  return this._myProperty;
}

public void setMyProperty(string value)
{
  this._myProperty = value;
}
127
WizLiz

プロパティはデータをカプセル化するために使用されます。あなたはプレーンフィールドを使うことができます:

public string MyField

しかし、このフィールドはあなたのクラスのすべての外部ユーザーがアクセスすることができます。人々は違法な値を挿入したり、あなたが期待していなかった方法で値を変更することができます。

プロパティを使用することで、データへのアクセス方法をカプセル化できます。 C#には、フィールドをプロパティに変換するためのNice構文があります。

string MyProperty { get; set; }

これは 自動実装プロパティ と呼ばれます。必要に応じて、あなたはあなたの財産を以下のように拡張することができます。

string _myProperty;

public string MyProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

setterの値を検証するコードを追加できます。

set
{
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentNullException();

    _myProperty = value;
}

プロパティは、取得メソッドと設定メソッドに対して異なるアクセサを持つこともできます。

public string MyProperty { get; private set; }

このようにして、誰でも読めるプロパティを作成しますが、それはクラス自身によってのみ変更することができます。

あなたのgetterに完全にカスタムな実装を追加することもできます。

public string MyProperty
{
    get
    {
        return DateTime.Now.Second.ToString();
    }
}

C#が自動実装プロパティをコンパイルすると、中間言語(IL)が生成されます。あなたのILにはget_MyPropertyset_MyPropertyメソッドがあります。また、<MyProperty>k_BackingFieldという名前のバッキングフィールドも作成されます(通常、これはC#では無効な名前になりますが、ILでは有効です。これにより、生成された型と独自のコードとの間で競合が発生しません)。ただし、C#では公式のプロパティ構文を使用する必要があります。これにより、C#でより優れたエクスペリエンスが生まれます(たとえばIntelliSenseなど)。

慣例により、長時間かかる操作にはプロパティを使用しないでください。

180
Wouter de Kort

最初のものと2番目のものはどちらもlike3番目のものを生成します。ただし、プロパティの構文がある場合は、3番目のものを使用しないでください。

最後に、getsetでやるべきことがないのなら、最初のものを使いましょう。

最後に、1番目と2番目は構文上の糖の一種にすぎませんが、なぜ必要以上のものをコーディングするのですか。

// more code == more bugs

ちょっとした楽しみをするために、これを考えてみましょう。

public string A { get; private set; }

これはもっとずっと簡単ですよね。 public修飾子は、getsetの両方で暗黙的ですが、オーバーライドすることもできます。もちろんこれは、プロパティ自体を定義するときに使用される修飾子の場合と同じ規則になります。

12
Mike Perrenoud

1日

string _myProperty { get; set; }

これは、.NETの世界では 自動プロパティ と呼ばれています。それは#2の単なる構文糖です。

第二

string _myProperty;

public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

これはそれを行う通常の方法です。あなたの財産で何らかの検証や追加のコードを行う必要がある場合に必要です。たとえば、WPFでは、Property Changedイベントを発生させる必要がある場合。そうでない場合は、autoプロパティを使用するだけで、かなり標準的なものになります。

3

string _myProperty;

public string getMyProperty()
{
    return this._myProperty;
}

public string setMyProperty(string value)
{
    this._myProperty = value;
}

ここでのthisキーワードは冗長です。まったく必要ありません。これらは、Javaのやり方のように、プロパティとは対照的に取得および設定される単なるメソッドです。

9
Andrew Grothe

これにより、getまたはsetスコープ内のコードを実行できます。

private string _myProperty;
public string myProperty
{
    get { return _myProperty; }
    set { _myProperty = value; }
}

自動プロパティも使用できます。

public string myProperty
{
    get;
    set;
}

そして。NetFrameworkはあなたのために管理します。それは良い実践であり、そしてそれをするのを簡単にするのでそれは創造的でした。

サンプルとして、これらのスコープの可視性を制御することもできます。

public string myProperty
{
    get;
    private set;
}

public string myProperty2
{
    get;
    protected set;
}

public string myProperty3
{
    get; 
}

更新

C#では、プロパティの値を初期化できます。サンプル用:

public int Property { get; set; } = 1;

セットなしで定義して読み取り専用にすることもできます。

public int Property { get; } = 1;

そして最後に、あなたは矢印関数を定義することができます。

public int Property { get; } => GetValue();
4
Felipe Oriani

わかりやすくするために、3番目の例では_myPropertyは実際にはプロパティではありません。これはgetメソッドとsetメソッドを持つフィールドです(そしてすでに述べたように、getメソッドとsetメソッドは戻り値の型を指定する必要があります)。

C#では、ほとんどの場合、3番目の方法は避けるべきです。返したい型が配列の場合、または単に値を返すのではなくgetメソッドで多くの作業が行われた場合にのみ実際に使用します。後者は必ずしも必要ではありませんが、明確にするために、多くの作業を行うプロパティのgetメソッドは誤解を招きやすいです。

2
OnABauer

3から始めましょう。それはうまくいきません。 public getMyProperty()にはリターンタイプがありません。

そして数字の1と2は実際には同じものです。 2は1がコンパイル後になるものです。

だから1と2は同じものです。 2つを使用すると、モデルに検証またはキャッシュを追加できます。

それ以外は同じになります。

1
DarthVader

最初のものはデフォルトで、返却や書き込みに特別なことは何もありません。 2ndと3rdは基本的に同じですが、3rdは2ndのもう少し拡張されたバージョンです。

0
NG.

最初のものは「短い」フォームです - あなたがあなたのゲッターとセッターに凝ったことをしたくないときに、あなたはそれを使います。この形式ではメソッドなどを実行することはできません。

2番目と3番目の形式はほぼ同じですが、2番目の形式は1行に圧縮されています。この形式はやや奇妙に見え、C 'Stylguidesに準拠していないため、stylecopによって推奨されていません。

私が私のゲッター/セッターを何か特別なものに使うつもりなら、3番目の形式を使います。遅延構造などを使用してください。

0
Christian Sauer