2015-04-02 108 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