注意:在C和C++中,未經初始化的變量是不能使用的。在C#中,系統將為每個未經初始化的變量提供一個默認值。這雖然中某種程序中保證了程序的安全性,但對本應初始化為某個特殊值的變量忘記了初始化,也常常會導致程序的執行誤入岐途。
對於靜態變量、非靜態的對象變量和數組變量,這些變量自動初始化為本身的默認值。對於所有引用類型的變量,默認值為null。所有值類型的變量的默認值見下表所示:
表12-1 部分類型的域初始化的值
變量類型 默認值 sbyte,byte,short,ushort,int,uint,long,ulong 0 char \x0000 float 0.0f double 0.0d decimal 0.0m bool false enum 0對於struct類型的變量,默認的初始化將對構成該結構的每一個值類型初始化為上表中的默認值,對構成其的每一個引用類型初始化為null。
如果在類中,沒有顯式地對域進行初始化,系統將賦予其一個默認值。域的默認初始化分為兩種情況:對於靜態域,類在裝載時對其進行初始化;對於非靜態域,在類的實例創建時進行初始化。在默認的初始化之前,域的值是不可預測的。
比如,下面的代碼是合法的:
class Test
{
static int a=b+1;
static int b=a+1;
}
實際上等價於:
a=1,b=2
而下面的代碼則是非法的:
class A
{
int x=1;
int y=x+1;
}
因為非靜態變量x在類A實例化以前並沒有初始化,代碼y=x+1無法得到正確的x的值。