静态引用一个类的'this'实例而不曾实例化该类的一个实例?
我编程在C#在Unity3D并学习对象池,当我遇到了类似样的代码来:静态引用一个类的'this'实例而不曾实例化该类的一个实例?
public class MyClass : Object
{
public static MyClass current;
void Awake()
{
current = this;
}
public void SomeMethod()
{
}
}
public class Other
{
void AnotherMethod()
{
MyClass.current.SomeMethod();
}
}
现在MyClass类是非静态的,但是参考“当前”,以它的实例“这'(静态)。 我可以调用公共的非静态方法,并通过在其他类中使用静态引用'current'来访问'this'实例,从而访问所有其他公共非静态变量。
但是,如果我从来没有创建类MyClass的实例,那么静态引用指向什么?
类Class
有一个静态字段,它持有对其自身单个实例的引用。如果您尝试从类Other
访问它而未分配current
的有效值,则会得到NullReferenceException
。
该实例可以在任何地方创建(因为它是一个公共静态字段),例如在某些启动代码中。使用单例模式时,该类将具有私有构造函数和一个GetInstance
(或GetCurrent
)方法,该方法将在调用该类时创建该类的实例,并且current
为空。
不能调用Awake()
而不必一个实例,所以它可能是这样被初始化:如果可能的话,因为它有一个全局变量的含义
static void Main()
{
// without this call, x.AnotherMethod will throw an exception.
new Class().Awake();
var x = new Other();
x.AnotherMethod();
}
给定的模式应该避免。您无法确定哪个时间点的场景指向current
。如果类Class
没有内部状态,则它可以被标记为静态,并且只暴露静态方法。
感谢您的帮助。我再次参考了这节课,它实际上是在代码中稍后初始化对象的。 “当前”只是一个静态参考。如果我以后不初始化,它会抛出一个空引用异常。再次感谢! – 2015-04-02 10:34:19
它会指向任何东西,因此它会抛出一个空引用异常
我真的很抱歉。这正是发生的情况。我提到了这一课,并且实际上是在稍后进行初始化。目前只是一个没有初始化的参考。 – 2015-04-02 10:32:19
您没有找到比'Class'更好的名字吗? – Rohit 2015-04-02 08:30:21
查看http://en.wikipedia.org/wiki/Singleton_pattern。 – Matten 2015-04-02 08:31:03
@kyle对不起!我的错。我编辑它到MyClass。 – 2015-04-02 09:00:22