4

私はそのような実装を見ました:

class MyClass
{
    private static readonly MyClass _instance = new MyClass();

    public static MyClass Instance{
        get{ return _instance; }
    }
}

シンプルにしないのはなぜですか?

class MyClass
{
    public static readonly MyClass Instance = new MyClass();
}
4

2 に答える 2

5

このようにパブリックフィールドを公開することはできますが、私は公開したくないと思います。プロパティのままにしておくと、後で実装を変更できます。たとえば、後でシングルトンを初期化せずに呼び出すことができる静的メソッドを追加するとします。プロパティバージョンを使用して、コードを次のように変更できます。

public sealed class MyClass
{
    public static MyClass Instance { get { return InstanceHolder.instance; } }

    private MyClass() {}

    private static class InstanceHolder
    {
        internal static readonly MyClass instance = new MyClass();
    }

    public static void Foo()
    {
        // Calling this won't initialize the singleton
    }
}

(元のバージョンでは、シングルトン初期化される場合とされない場合があります。CLR次第です。)

これは、後で実装を変更したい理由の例にすぎません。プロパティを使用すると、それを実行できます。フィールドを使用すると、実行できません。

于 2013-01-03T20:07:36.650 に答える
2

あなたがそこに持っているものはうまくいくでしょう、しかし公共の場は通常プロパティを支持して眉をひそめます。get { ... }呼び出しコードを変更することなく、の実装を変更できます。これにより、(たとえば)インスタンスが最初に使用されたときにのみ作成される遅延初期化に切り替えることができます。

呼び出し元のコードを変更する必要はありませんが、読み取り専用プロパティは読み取り専用フィールドとは異なるため、クラスの署名が変更されることに注意してください。

于 2013-01-03T20:07:31.863 に答える