1

私はC#に非常に慣れていませんが、現在、常に同じインスタンスを使用するためにこの方法を使用しています:

public class Sample{
    private Sample(){
        //initialize sth.
    }

    private static Sample _instance;
    public static Sample Instance{
        get{
            if(_instance == null)
                _instance = new Sample();
            return _instance;
        }
    }
}

私にはオブジェクト指向とは思えないので、もっと良い方法を知っていますか...

4

5 に答える 5

2

あなたの質問への答えは、あなたがプロパティをどのように使用するつもりかによって異なります。一般に、アプリ全体で単一の静的プロパティを使用すると、マルチスレッド環境や単体テストなどで多くの問題が発生する可能性があるため、悪い考えと見なされます。ただし、実際には、正しいアプローチ(例:ロギング)。

または、インスタンスを必要とする人にインスタンスを渡す別のアプローチを使用することもできます。これは、より一般的には依存性注入として知られています。

于 2012-10-15T13:30:36.903 に答える
0

はい、このアプローチは完全に有効です。getterただし、プロパティののシングルトンのインスタンスを初期化する場合は注意が必要Instanceです。特に、オブジェクトの作成に時間がかかる場合は注意が必要です。

于 2012-10-15T13:29:47.467 に答える
0

確かに、使用Lazy<T>して、実装がもたらす競合状態を回避するためにフレームワークに対処させてください。

private static Lazy<Sample> _instanceLazy = new Lazy<Sample>(() => new Sample());
public static Instance{get {return _instanceLazy.Value;} }

シングルトンは最悪だということを覚えておく価値は間違いありません。

于 2012-10-15T13:30:25.250 に答える
0

シングルトンを作成するには、複数のアプローチを使用できます。

明示的に記述した場合、私が見つけた最良の実装方法(スレッドセーフ)は次のとおりです。

public sealed class Singleton
{
    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }

        internal static readonly Singleton instance = new Singleton();
    }
}

ただし、別の方法は、UnityやCastleWindsorなどの制御の反転フレームワークを使用することです。これを構成してクラスをシングルトンとして扱うことができます。

于 2012-10-15T13:32:21.627 に答える
0

Singleton クラスが必要な場合は問題ありません。この種のパターンは、このクラスのインスタンスを 1 つだけ持つために使用されます。

于 2012-10-15T13:28:20.087 に答える