我想得到一个静态类的实例,但是如果没有在非静态类上实现单例包装器,我似乎无法做到这一点 - 这是可能的,还是我错过了什么?
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;
}
}
}
答案 0 :(得分:13)
没有静态类的实例。单例模式只是将类的实例返回给重复的请求。
您可能会感到困惑:
private static MyClass _myInstance;
这仅仅意味着在具有_myInstance作为成员的类型实例化的所有对象中将存在该特定对象的单个实例。
一些注意事项:
this
关键字在静态成员中无效this
永远不会有效进一步阅读: 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
指的是在静态类中没有意义的类的实例,因为不能有一个实例。这本身就应该让你意识到你所问的问题存在一个根本性的错误:“我想得到一个静态类的实例”。您无法返回静态类的实例,因为无法实例化定义静态类。
单例模式只是确保您始终返回类的相同实例。但是所说的课程永远不会是静止的。