4

したがって、不変クラスを設計するときは、 get プロパティをそのまま使用する必要があります

public sealed class Person
{
    readonly string name;
    readonly int age;

    public Person(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    public string Name
    {
        get { return name; }
    }

    public int Age
    {
        get { return age; }
    }
}

または、パブリック読み取り専用フィールドを公開することは有効ですか

public sealed class Person
{
    public readonly string Name;
    public readonly int Age;

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}
4

2 に答える 2

10

どちらのオプションでも、フィールドを外部から変更できないオブジェクトが残りますが、不変オブジェクトには、それ以外の場合と同じガイドラインが適用されます。

フィールドをパブリックに公開する代わりにプロパティを使用することには、依然として利点があります。入力値をチェックしていませんが、型の将来のバージョンでは、内部フィールドから値を直接読み取るのではなく、値の一部を計算する可能性があります。プロパティを使用することで、その実装の詳細を隠すことができるため、将来の変更に対する柔軟性が高まります。

于 2012-11-22T23:40:52.320 に答える
1

.net のクラス フィールドの主な問題の 1 つpublic readonlyは、外部コードの観点から、readonly宣言が行う唯一のことは、フィールドに読み取り専用属性をマークすることです (スペルと大文字小文字を忘れてしまいました)。一部の言語は外部コードでそのような属性を尊重しますが、言語はそのような属性を無視することもできます。フィールドを持つオブジェクトがpublic readonly、読み取り専用属性を無視する言語で記述されたコードに公開された場合、そのコードは属性が存在しないかのように簡単にそのようなフィールドに書き込むことができます。

構造は別の問題です。field に格納された構造体にfooという名前の独自のフィールドがある場合、bozに書き込み可能なコードは に書き込むことfooができ、に書き込めfoo.bozないコードは に書き込むことはfooできません。または不変。これは、 ifが同じ型の構造体である場合、ステートメントがと同じインスタンスを参照するのではなく、 の対応するフィールドの値と一致するようにのすべてのパブリック フィールドとプライベート フィールドを変更することによって機能するためです。foo.bozbozfoo1foo = foo1foofoo1foofoo1

ボックス化された値の型はさらに悪いです。Object任意の値型のボックス化されたインスタンスを保持する がある場合、その値はその型の別のものに置き換えることができます。のような不変と思われる型でさえInt32、ボックス化すると、可変参照型として動作します。

したがって、構造体型を使用する場合は、正確な構造体型のプライベート フィールドに構造体を格納することにより、不変性を強制する必要があります。構造体フィールドを不変にしようとすると、型のインスタンスが扱いにくくなる可能性がありますが、構造体インスタンスの可変性または不変性には実際の影響はありません。

于 2012-11-25T18:27:56.410 に答える