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

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

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

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

您可能会感到困惑:

 private static MyClass _myInstance; 

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

几点说明:

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

进一步阅读: Jon Skeet 在C#In Depth中有一篇关于实现Singletons的优秀文章。 我建议阅读和研究这篇文章,直到你理解它为止。 这是非常好的。

没有理由将instance to a static class返回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; 

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

让你的class级非静态。 (只需保持方法静态。)

你的术语是错的。 请阅读有关static关键字的MSDN文章 。

无法通过实例引用静态成员。 而是通过类型名称引用它。

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

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

主要问题在于:

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

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

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