2011-01-06 73 views
1

只是好奇,從下面的代碼中我可以看到,類型A的靜態字段默認爲空,而該類型的變量需要初始化爲至少空值。任何人都可以解釋一下這個區別嗎?謝謝爲什麼靜態字段默認爲空?

class Program 
{ 
    static A _a; //it is null by default 
    static void Main(string[] args) 
     { 
      A nonStaticA; //empty reference, exception when used 
      A correctA=null; 
     } 
} 
class A 
{ 
} 
+2

它不僅僅是靜態字段,它是所有的字段(類級變量),它們被初始化爲默認值(null用於引用,0用於數字,false用於布爾等)。 – 2011-01-06 09:27:43

回答

1

區別在於局部變量字段,不在靜態和實例之間。

任何類型的局部變量在被首先使用之前都需要被初始化爲一個值。這可以防止您忘記初始化變量的錯誤。

字段是不同的問題,因爲它可能無法在聲明時初始化所有字段。例如,初始值可能取決於構造函數參數。因此,字段不需要顯式初始化,如果不是,則獲取該類型的默認值,即所有引用類型爲null

2

它與static無關。類字段(實例和靜態)被初始化爲默認值,而局部變量則不是。

爲什麼?像許多事情一樣,這是一個設計決定。

4

字段的初始值無論是靜態字段還是實例字段都是字段類型的默認值。在默認初始化發生之前,無法觀察字段的值,因此字段永遠不會「未初始化」。

如果類中存在靜態構造函數,則在執行靜態構造函數之前立即執行靜態字段初始化函數。否則,靜態字段初始值設定項會在第一次使用該類的靜態字段之前的執行相關時間執行。

局部變量不會自動初始化,因此沒有默認值。爲了進行明確的分配檢查,本地變量首先被認爲是未分配的。

0

就我所知,C#保留了很多與以前的其他語言一樣的東西,主要是C++。

C++(可能與C#可能相關或不相關)的原因是,靜態(或全局)對象靜態寫入可執行文件或庫,而其他對象創建對象的代碼(而不是對象本身)被寫入可執行文件或庫中。對於堆棧中的對象,通常會寫入從棧指針中減去一些值的代碼。

當操作系統將可執行文件或庫加載到內存中時,靜態字段只是一堆按原樣複製到內存(進程的數據段)中的字節。由於它們按原樣複製,所以它們已經具有值(可執行文件或庫文件中的值)。因此,將其設置爲特定值不會有性能影響。出於這個原因(就我所知),C++標準使得它們的值是確定性的(如果它們沒有被顯式初始化)以及什麼比作爲初始化值的零更自然?!

爲了初始化動態對象(無論是堆棧還是堆),代碼必須被插入到可執行文件或庫中。這具有性能影響(可能還有其他影響),因此C++標準傾向於將其留給程序員。

我並不完全確定這些數據的每一個都是真實的,但從我所瞭解的情況來看,這似乎符合邏輯。

相關問題