これらのステートメントは同じことを意味しますか?
int x { get; }
readonly int x;
あなたの質問への答え: readonly と {get; には違いがあります。}:
(int x { get; }
xを設定する方法がないためコンパイルされません-必要だと思いますpublic int x { get; private set; }
)で、コードはxを変更し続けることができます
ではreadonly int x;
、x はコンストラクターまたはインラインで初期化され、変更できません。
readonly int x;
クラスで読み取り専用フィールドを宣言します。このフィールドはコンストラクターでのみ割り当てることができ、その値はクラスの存続期間中変更できません。
int x { get; }
読み取り専用の自動実装プロパティを宣言し、この形式では無効です (値を設定する方法がまったくないため)。通常の読み取り専用プロパティは、呼び出されるたびに同じ値を返すことを保証しません。値は、クラスの存続期間を通じて変化する可能性があります。例えば:
public int RandomNumber
{
get { return new Random().Next(100); }
}
これにより、呼び出すたびに異なる番号が返されます。(はい、これはプロパティのひどい乱用です)。
いいえ、ステートメントは同じことを意味しません。プロパティのフル バージョンには、バッキング変数があります。
private int _x;
public int X
{
get { return _x; }
}
クラスの別のメソッドは、バッキング変数を変更して、プロパティの値を変更できます。
private void SomeMethod(int someValue)
{
_x = someValue * 5;
}
readonly
キーワードは、宣言またはコンストラクターでメンバー変数を割り当てることのみを許可します。
// Both of these compile
private readonly int _x = 1;
public SomeClass()
{
_x = 5;
}
// This will not compile
private void SomeMethod(int someValue)
{
_x = someValue * 5;
}
したがって、get
バッキング変数がマークされている -only プロパティreadonly
は、真の読み取り専用プロパティです。
x
文字通り、 private として宣言されているため (デフォルト)、大きな違いはありません。クラスをいつでも再コンパイルして、x を異なるものにすることができます。
ただし、パブリックの場合、定義public int x { get; }
により、後で定義を次のように拡張できます。
int x { get {
return DoSomeOperation();
}
}
クライアントを壊すことなくそれを行うことができます。ゲッターの実装はプライベートであり、クライアントはそれが静的な値であるか、get
アクセサー内に操作があるかどうかを知らずに呼び出します。