1

readonlyC#でフィールドを作る目的は何ですか?

実際には、フィールドの変更を妨げているようには見えません:

public struct Struct
{
    public readonly int Value;
    public Struct(int value)
    {
        this.Value = value;
    }
}

static class Program
{
    static void Main()
    {
        var s = new Struct(1);
        Debug.Assert(s.Value == 1, "Read-only field is 1");
        s = new Struct(2);
        Debug.Assert(s.Value == 2, "Read-only field written!");
    }
}

これは抜け穴と見なされますか、それとも設計によるものですか?
また、フィールドは簡単に変更できるため、いつフィールドを作成するメリットがあるでしょうreadonlyか?

4

4 に答える 4

7

これは抜け穴と見なされますか、それとも設計によるものですか?

それは設計によるものです。

フィールド自体が (構造体の内部または外部で) 直接変更されるのを防ぎますが、それは変数の値全体 (sこの場合) を新しいStruct値に置き換えることができないという意味ではありません。

特に「値全体」の置換はアトミックではない可能性があるため、クラスよりも構造体の方が明らかに有用ではありませんが、それでも有用なIMOです。

別の言い方をすれば...整数は不変の値と考えることができますよね?しかし、このコードはまだ有効です:

int x = 10;
x = 20;

これは値を変更しますx- 10 の意味は変更しません。

于 2013-05-09T08:53:26.330 に答える
2

の別のインスタンスがありますStructreadonly元の の値を上書きしていませんStruct。つまり、変数sには 1 が割り当てられStruct、後でValue2 が割り当てられますStructValue

のポイントはreadonly、初期化中または型の構築中にフィールドの値を設定できるようにすることですが、あとがきでは設定できません。

試してみると:

static void Main()
{
    var s = new Struct(1);
    Debug.Assert(s.Value == 1, "Read-only field is 1");
    s.Value = 2;
    Debug.Assert(s.Value == 2, "Read-only field written!");
}

「読み取り専用フィールドを割り当てることはできません (コンストラクターまたは変数初期化子を除く)」というコンパイラ エラーが発生します。

于 2013-05-09T08:53:12.003 に答える
1

コンストラクターまたは宣言はそれらに書き込むことができますが、他の人は書き込みできません。

MSDN から: 「フィールド宣言に readonly 修飾子が含まれている場合、宣言によって導入されたフィールドへの割り当ては、宣言の一部として、または同じクラスのコンストラクターでのみ発生します。」

于 2013-05-09T08:53:16.703 に答える
1

Microsoft Docsから:

読み取り専用フィールドは、宣言またはコンストラクターで初期化できます。

于 2013-05-09T08:53:16.813 に答える