如何在c#中返回一个静态类实例

时间:2012-05-09 10:59:34

标签: c# singleton

我想得到一个静态类的实例,但是如果没有在非静态类上实现单例包装器,我似乎无法做到这一点 - 这是可能的,还是我错过了什么?

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;
        }
    }
}

5 个答案:

答案 0 :(得分:13)

没有静态类的实例。单例模式只是将类的实例返回给重复的请求。

您可能会感到困惑:

private static MyClass _myInstance;

这仅仅意味着在具有_myInstance作为成员的类型实例化的所有对象中将存在该特定对象的单个实例。

一些注意事项:

  • this关键字在静态成员中无效
  • 如果您有静态类,那么所有成员都必须是静态的,因此this永远不会有效
  • Singleton类不能是静态类
  • Singletons声明一个静态成员,以帮助确保只存在该类的单个实例
  • 请注意,对对象的静态引用不会使对象成为静态。只有参考是静态的

进一步阅读: Jon Skeet在实施Singletons in C# In Depth方面做得非常出色。我建议阅读和研究这篇文章,直到你理解它为止。非常好。

答案 1 :(得分:3)

没有理由返回instance to a static class(如果该类是静态的,则没有实例)。

您可以从任何地方访问该课程,为什么要将instance返回给它?我无法想象有任何理由这样做。

静态类使用

要使用静态类,只需按以下方式编写:

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

正如您所看到的,声明变量甚至没有意义,因为这看起来像这样:

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

如果您想要一个较短的名字,您可以使用:

 using MSC = MyNamespace.MyStaticClass;

答案 2 :(得分:2)

从您的评论中我假设您的解决方案是:

让你的课程非静态。 (只需保持方法静态。)

答案 3 :(得分:0)

你的术语错了。请阅读MSDN article on the static keyword

  

无法通过实例引用静态成员。相反,它   通过类型名称引用。

singleton是一个只允许自己的单个实例的类。 C#中常见的一点是:

public class MyClass
{
    private MyClass _value = null;

    public MyClass Value {
        get { return _value ?? (_value = new MyClass()); }
    }
}

答案 4 :(得分:0)

主要问题在于:

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

this指的是在静态类中没有意义的类的实例,因为不能有一个实例。这本身就应该让你意识到你所问的问题存在一个根本性的错误:“我想得到一个静态类的实例”。您无法返回静态类的实例,因为无法实例化定义静态类。

单例模式只是确保您始终返回类的相同实例。但是所说的课程永远不会是静止的。