2011-06-23 40 views
1

我想了解片斷低於3組之間的差異:C#在類之外創建一個靜態對象VS在類中創建它之間有什麼區別?

private static FirstObject o = new FirstObject(); 
public class ClassA 
{ 
} 

//----------------------------------------------------- 

public class ClassA 
{ 
    private static FirstObject o = new FirstObject(); 
} 

//----------------------------------------------------- 

public class ClassA 
{ 
    private static FirstObject o; 

    public ClassA 
    { 
     o = new FirstObject(); 
    } 
} 

請幫我在範圍,內存,性能和這些使用條款理解。

謝謝。

+1

這些是一些奇怪的比較標準。另外,如果靜態變量應該在第一個例子中,如果在ClassA之外? – BoltClock

+0

如果它是一個集合,即字典,那麼我可以在其中添加對象。 – InfoLearner

回答

5
  1. 無效,因爲不能有對象

  2. 的正確方法的可變外 - 類具有靜態構件,當類是第一次訪問,其被初始化

  3. 非常糟糕,因爲每次創建新對象時都會重新創建靜態對象。

+1

如果'ClassA'是一個嵌套類(使對象與該類無關),那麼唯一可以想到的第一種使用方法是有效的。但是,這不是一個很好的假設。 – BoltClock

+0

我有同樣的想法,@BoltClock。 –

1

第一個選項不會編譯。 C#中的靜態變量必須作用於類或結構體。

第二個選項是首選機制。

第三個選項是錯誤的,因爲這將創建創建的ClassA實例的新FirstObject每一次,這幾乎肯定是不你想要什麼。

第四個選擇是利用一個靜態構造函數,例如,

public class ClassA 
{ 
    private static FirstObject o; 
    static ClassA 
    { 
     o = new FirstObject(); 
    } 
} 

此選項很有用,如果有一些特殊的結構約束FirstObject。不過,在本例中,選擇選項2而不是選項4.只要知道選項4存在。

+0

因此,使用靜態構造函數只會在創建時調用一次?使對象保持當前狀態,而不管ClassA的新實例如何? – cgatian

+0

最多一次將調用一個靜態構造函數。它保證在創建類的任何實例或正被訪問的任何成員之前發生。 http://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=VS.100%29.aspx –

-1

三種情況如下......

  1. 假設一個錯字這裏缺少一些外結構......「O」聲明如此,這將是全球可訪問,作爲單個對象,整個應用程序。它將具有一套共同的所有屬性和數據。它可以通過「Namespace.o」直接訪問
  2. 聲明瞭「o」,這樣它就可以作爲單個對象全局訪問整個應用程序,但它只能通過另一個定義的「ClassA」實例訪問, 。 ClassA的每個單獨的實例將具有相同的單個「o」對象,並具有相同的屬性和數據。
  3. 這看起來不正確,我假設「ol」應該是「o;」。即使這樣,代碼看起來像是缺少的東西。如果Line「o = new FirstObject」是正確的,則不能以此方式訪問。
+0

這個答案根本不對。 1)即使使用外部構造,也不能使用「Namespace.o」來訪問它。 2)在這種情況下,「o」不是全局可訪問的。 3)這個選項在語法上沒有任何錯誤,也沒有任何阻止以這種方式使用「o」的東西,儘管這是一個非常糟糕的例子。 –

+0

是的,我打字很快。應該更清楚地表明外部結構包括一個類。我的意思是「Qualifier ... o」類型的東西,本來就是Pseudo。我在編輯器中嘗試了數字3的格式,但它似乎並不適合我。 – DarrenMB

相關問題