ゲッターとセッターの宣言の違いは何なのか、また、優先される方法があるかどうか(そしてその理由)を知りたいです。最初の方法は 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_MyProperty
。set_MyProperty
また、と呼ばれるバッキング フィールドも作成されます<MyProperty>k_BackingField
(通常、これは C# では無効な名前ですが、IL では有効です。この方法では、生成された型と独自のコードの間で競合は発生しません)。ただし、C# では公式のプロパティ構文を使用する必要があります。これにより、C# でのエクスペリエンスが向上します (たとえば、IntelliSense を使用)。
慣例により、時間のかかる操作にはプロパティを使用しないでください。