18

これらのステートメントは同じことを意味しますか?

int x { get; }
readonly int x;
4

6 に答える 6

25

あなたの質問への答え: readonly と {get; に違いがあります。}:

int x { get; }xを設定する方法がないためコンパイルされません-必要だと思いますpublic int x { get; private set; })で、コードはxを変更し続けることができます

ではreadonly int x;、x はコンストラクターまたはインラインで初期化され、変更できません。

于 2010-07-27T15:18:28.230 に答える
12

readonly int x;クラスで読み取り専用フィールドを宣言します。このフィールドはコンストラクターでのみ割り当てることができ、その値はクラスの存続期間中変更できません。

int x { get; }読み取り専用の自動実装プロパティを宣言し、この形式では無効です (値を設定する方法がまったくないため)。通常の読み取り専用プロパティは、呼び出されるたびに同じ値を返すことを保証しません。値は、クラスの存続期間を通じて変化する可能性があります。例えば:

public int RandomNumber
{
    get { return new Random().Next(100); }
}

これにより、呼び出すたびに異なる番号が返されます。(はい、これはプロパティのひどい乱用です)。

于 2010-07-27T15:19:01.927 に答える
4

いいえ、ステートメントは同じことを意味しません。プロパティのフル バージョンには、バッキング変数があります。

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は、真の読み取り専用プロパティです。

于 2010-07-27T15:25:13.037 に答える
-1

x文字通り、 private として宣言されているため (デフォルト)、大きな違いはありません。クラスをいつでも再コンパイルして、x を異なるものにすることができます。

ただし、パブリックの場合、定義public int x { get; }により、後で定義を次のように拡張できます。

int x { get {
     return DoSomeOperation();
    }
}

クライアントを壊すことなくそれを行うことができます。ゲッターの実装はプライベートであり、クライアントはそれが静的な値であるか、getアクセサー内に操作があるかどうかを知らずに呼び出します。

于 2010-07-27T15:21:20.227 に答える