.NET での Getter と Setter の宣言 [重複] 質問する

.NET での Getter と Setter の宣言 [重複] 質問する

ゲッターとセッターの宣言の違いは何なのか、また、優先される方法があるかどうか(そしてその理由)を知りたいです。最初の方法は 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;
}

ベストアンサー1

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

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

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

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 を使用)。

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

おすすめ記事