我在Unity3D中用C#编程,当我遇到类似的代码时,我正在学习对象池:
public class MyClass : Object
{
public static MyClass current;
void Awake()
{
current = this;
}
public void SomeMethod()
{
}
}
public class Other
{
void AnotherMethod()
{
MyClass.current.SomeMethod();
}
}
现在类MyClass是非静态的,但是对它的实例'this'的引用'current'是(静态的)。 我可以通过在其他类中使用静态引用“current”到'this'实例来调用公共非静态方法并访问所有其他公共非静态变量。
但是如果我从未创建过类MyClass的实例,那么静态引用指向什么?
答案 0 :(得分:1)
类Class
有一个静态字段,其中包含对其自身的单个实例的引用。如果您尝试从课程Other
访问它而未指定current
的有效值,则会获得NullReferenceException
。
可以在任何地方创建实例(因为它是公共静态字段),例如在某些启动代码中。使用单例模式,该类将具有私有构造函数和GetInstance
(或GetCurrent
)方法,该方法在调用类时创建类的实例,并且current
为null。 / p>
如果没有实例,则无法调用Awake()
,因此可能会将其初始化为:
static void Main()
{
// without this call, x.AnotherMethod will throw an exception.
new Class().Awake();
var x = new Other();
x.AnotherMethod();
}
应尽可能避免给定的模式,因为它具有全局变量的含义。您无法确定current
字段指向哪个实例。如果类Class
没有内部状态,则可以将其标记为静态,并仅显示静态方法。
答案 1 :(得分:0)
它将指向任何内容,因此它将抛出一个空引用异常