9

静的クラスのインスタンスを取得したいのですが、非静的クラスにシングルトン ラッパーを実装しないとこれを行うことができないようです。これは可能ですか、それとも何か不足していますか?

public class MyInstanceTester
 {
    public MyInstanceTester()
    {
        //this is how i get a reference to a singleton now
        MyClass instance1 = MyClass.Instance();
        //this is what is would like to do (if only the compiler would let me)
        MyStaticClass instance2 = MyStaticClass.Instance();
    }
}


public class MyClass
{
    private static MyClass _myInstance;

    static MyClass()
    {
        _myInstance = new MyClass();
    }


    public static MyClass Instance()
    {
        return _myInstance;
    }

}

public static class MyStaticClass
{
    public static MyStaticClass Instance
    {
        get
        {
            return this;
        }
    }
}
4

5 に答える 5

15

静的クラスのインスタンスのようなものはありません。シングルトン パターンは、繰り返し要求に対してクラスの同じインスタンスを返すだけです。

次のことに混乱している可能性があります。

private static MyClass _myInstance;

これは単に、メンバーとして _myInstance を持つ型でインスタンス化されたすべてのオブジェクトの中で、その特定のオブジェクトの単一のインスタンスが存在することを意味します。

いくつかのメモ:

  • thisキーワードは静的メンバーでは無効です
  • 静的クラスがある場合、すべてのメンバーは静的でなければならないため、this有効になることはありません
  • シングルトン クラスを静的クラスにすることはできません
  • シングルトンは、そのクラスの単一のインスタンスのみが存在することを保証するために、単一の静的メンバーを宣言します
  • オブジェクトへの静的参照は、オブジェクトを静的にしないことに注意してください。参照のみが静的です

Further reading: Jon Skeet has an excellent write up on implemeting Singletons in C# In Depth. I would suggest reading and studying this article until you grok it. It is quite good.

于 2012-05-09T11:01:11.833 に答える
3

a を返す理由はありませんinstance to a static class(クラスが static の場合、インスタンスはありません)。

どこからでもクラスにアクセスできますが、なぜそれに a を返すのinstanceですか? これを行う理由は想像できません。

静的クラスの使用

静的クラスを使用するには、次のように記述します。

MyStaticClass.MyMethod();
Int32 callCount = MyStaticClass.CallCount;

ご覧のとおり、変数を宣言しても意味がありません。これは次のようになるためです。

MyStaticClass msc = MyStaticClass.Instance();
msc.MyMethod();
Int32 callCount = msc.CallCount;

より短い名前が必要な場合は、次を使用できます。

 using MSC = MyNamespace.MyStaticClass;
于 2012-05-09T11:03:28.000 に答える
2

あなたのコメントから、あなたの解決策は次のようになると思います:

クラスを非静的にします。(メソッドを静的に保つだけです。)

于 2012-05-09T14:53:23.323 に答える
0

あなたの用語は間違っています。staticキーワードに関するMSDNの記事をお読みください。

静的メンバーは、インスタンスを介して参照することはできません。代わりに、タイプ名を介して参照されます。

シングルトンは、それ自体の単一のインスタンスのみを許可するクラスです。C#でのこれの一般的な意味は次のとおりです。

public class MyClass
{
    private MyClass _value = null;

    public MyClass Value {
        get { return _value ?? (_value = new MyClass()); }
    }
}
于 2012-05-09T11:04:02.400 に答える
0

主な問題はここにあります:

public static class MyStaticClass 
{     
    public static MyStaticClass Instance
    {         
         get
             {             
                  return this; //compile time error!
             }
    }
}

this静的クラスのインスタンスは存在できないため、静的クラスでは意味をなさないクラスのインスタンスを指します。これだけで、「静的クラスのインスタンスを取得したい」という根本的なエラーがあることに気付くはずです。定義上、静的クラスはインスタンス化できないため、静的クラスのインスタンスを返すことはできません。

シングルトンパターンは、クラスの同じインスタンスを常に返すようにするだけです。しかし、そのクラスは決して静的であってはなりません。

于 2012-05-09T11:05:06.183 に答える