如何在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
指的是一个在静态类中没有意义的类的实例,因为不能有一个实例。 这本身应该让你意识到你所要问的是一个根本的错误:“我想得到一个静态类的实例”。 您不能将静态类的实例作为静态类返回,因为定义无法实例化。
单例模式只是确保您始终返回类的同一实例。 但是所说的课程永远不会是静止的。