2015-04-02 62 views
0

我编程在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的实例,那么静态引用指向什么?

+1

您没有找到比'Class'更好的名字吗? – Rohit 2015-04-02 08:30:21

+0

查看http://en.wikipedia.org/wiki/Singleton_pattern。 – Matten 2015-04-02 08:31:03

+0

@kyle对不起!我的错。我编辑它到MyClass。 – 2015-04-02 09:00:22

回答

1

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没有内部状态,则它可以被标记为静态,并且只暴露静态方法。

+0

感谢您的帮助。我再次参考了这节课,它实际上是在代码中稍后初始化对象的。 “当前”只是一个静态参考。如果我以后不初始化,它会抛出一个空引用异常。再次感谢! – 2015-04-02 10:34:19

0

它会指向任何东西,因此它会抛出一个空引用异常

+0

我真的很抱歉。这正是发生的情况。我提到了这一课,并且实际上是在稍后进行初始化。目前只是一个没有初始化的参考。 – 2015-04-02 10:32:19