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永远不会有效
  • 单例类不能是静态类
  • 单例声明一个静态成员以帮助确保该类只存在一个实例
  • 请注意,对对象的静态引用不会使对象成为静态的。只有引用是静态的

进一步阅读: Jon Skeet 有一篇关于在 C# In Depth 中实现单例的出色文章。我建议您阅读和研究这篇文章,直到您理解它为止。这是相当不错的。

于 2012-05-09T11:01:11.833 回答
3

没有理由返回 a 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;
于 2012-05-09T11:03:28.000 回答
2

根据您的评论,我认为您的解决方案是:

使您的课程非静态。(只需保持方法静态。)

于 2012-05-09T14:53:23.323 回答
0

你的术语是错误的。请阅读有关静态关键字的 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 回答