161

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

1位

string _myProperty { get; set; }

2位

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;
}
4

8 に答える 8

223

プロパティは、一部のデータをカプセル化するために使用されます。プレーンフィールドを使用できます:

public string MyField

ただし、このフィールドには、クラスのすべての外部ユーザーがアクセスできます。不正な値を挿入したり、予期しない方法で値を変更したりする可能性があります。

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

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;
}

プロパティは、getter と setter に対して異なるアクセサーを持つこともできます。

public string MyProperty { get; private set; }

このようにして、誰でも読み取ることができるが、クラス自体だけが変更できるプロパティを作成します。

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

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

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

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

于 2013-07-26T12:30:38.773 に答える
15

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

get最後に、またはで行う作業がない場合はset、最初のものを使用します。

結局のところ、1 番目と 2 番目は構文糖衣の一種にすぎませんが、なぜ必要以上にコーディングする必要があるのでしょうか。

// more code == more bugs

ちょっとした楽しみとして、次のことを考えてみてください。

public string A { get; private set; }

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

于 2013-07-26T12:19:39.560 に答える
9

1位

string _myProperty { get; set; }

これは、.NET の世界では自動プロパティと呼ばれます。#2 のシンタックス シュガーです。

2位

string _myProperty;

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

これは通常の方法であり、プロパティで検証や追加のコードを実行する必要がある場合に必要です。たとえば、プロパティ変更イベントを発生させる必要がある場合は、WPF で。そうでない場合は、 auto プロパティを使用してください。これはほとんど標準です。

3

string _myProperty;

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

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

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

于 2013-07-26T12:25:26.060 に答える
3

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

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

于 2013-07-26T13:14:25.277 に答える