9

Singleton クラスの「インスタンスを取得」する必要がある API エンドユーザーの観点から、.Instance プロパティを「取得」する、.GetInstance() メソッドを「呼び出す」のどちらが好きですか?

public class Bar
{
    private Bar() { }

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return new Bar();
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return new Bar();
    }
}
4

7 に答える 7

19

C# では.Instance、一般的なガイドラインに適合するので、私ははるかに好みます。

于 2009-09-01T04:11:57.133 に答える
14

シングルトンを作成する場合、すべてのGetInstance呼び出しまたはInstanceプロパティ ゲッターで新しいオブジェクトを返すことはできません。次のようにする必要があります。

public sealed class Bar
{
    private Bar() { }

    // this will be initialized only once
    private static Bar instance = new Bar();

    // Do you prefer a Property?
    public static Bar Instance
    {
        get
        {
            return instance;
        }
    }

    // or, a Method?
    public static Bar GetInstance()
    {
        return instance;
    }
}

そして、どの方法を選択するかは問題ではありません。プロパティでの作業を好む場合は、それを選択してください。メソッドを好む場合は、それも問題ありません。

于 2009-09-01T04:17:56.950 に答える
4

ほぼすべての場合と同様に、状況によって異なります:)

シングルトンが遅延ロードされており、インスタンス化する作業量が少ない場合は、GetInstance() がより適切です。メソッド呼び出しは作業が完了していることを示しているからです。

シングルトン インスタンスを保護するために単純にマスキングする場合は、プロパティを使用することをお勧めします。

于 2009-09-01T04:14:50.013 に答える
3

依存します。パラメータを渡す必要がありますか? もしそうなら、GetInstance() を実行します。そうでない場合は、おそらく問題ではありません (少なくとも呼び出しの観点からは、とにかく両方のメソッドであるためです。ただし、より標準ベースになろうとしている場合問題であり、その場合、インスタンスが表示されますより良くなるために)。

于 2009-09-01T04:12:11.390 に答える
3
public class Singleton
{

    private volatile static Singleton uniqueInstance;
    private static readonly object padlock = new object();

    private Singleton() { }

    public static Singleton getInstance()
    {
        if (uniqueInstance == null)
        {
            lock (padlock)
            {
                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }
            }
        }
        return uniqueInstance;
    }
}

上記のコードでは、二重チェックが実装されています。最初に、インスタンスが作成されているかどうかがチェックされ、そうでない場合はロックが確立されています。このブロックで 1 回

                if (uniqueInstance == null)
                {
                    uniqueInstance = new Singleton();
                }

インスタンスが null の場合は作成します。

また、uniqueInstance 変数は、インスタンス変数にアクセスできるようになる前にインスタンス変数への割り当てが完了するように、volatile として宣言されています。

于 2009-09-01T13:03:39.477 に答える
0

私はプロパティを好みます。これらは標準的なパターンです。

于 2009-09-01T04:14:38.140 に答える
0

@Rexが言ったように、それはあなたが伝えたいセマンティックに依存します。

GetInstance() は、必ずしもシングルトン インスタンスを意味するわけではありません。そのため、インスタンスの作成がオンデマンドで行われる場合に GetInstance() を使用します。直接の新規は望ましくなく、インスタンスは可能ですが、同じであるとは限りません。オブジェクト プールもこれらの基準に適合します。(実際、シングルトンは、状態を保持するオブジェクト プールの特殊化です :-))

一方、静的インスタンス プロパティは、シングルトンと保存されたインスタンス ID を意味します。

ところで、@RaYell が言及したように、サンプル コードはシングルトンではないため、インスタンス プロパティを使用しないでください。この場合でも、インスタンス ファクトリとして機能するので、GetInstance() メソッドを使用できます。

于 2009-09-01T04:23:33.193 に答える