1. ホーム
  2. c#

[解決済み] .NETのゲッター宣言とセッター宣言【重複】について

2022-04-25 03:18:30

質問

これらのゲッターとセッターの宣言の違いは何なのか、また、好ましい方法はあるのか(そしてその理由)。最初のものは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;
}

解決方法は?

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

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を使用した場合など)。

慣例として、時間がかかる操作にはプロパティを使うべきではない。