2012-02-10 121 views
47

我的代碼如下爲什麼編譯錯誤「使用未分配的局部變量」?

int tmpCnt; 
if (name == "Dude") 
    tmpCnt++; 

爲什麼會出現錯誤Use of unassigned local variable tmpCnt?我知道我沒有明確地初始化它,但由於Default Value Table的值類型初始化爲0反正。該參考文件還提醒我:

請記住,不允許在C#中使用未初始化的變量。

但是爲什麼我必須明確地做,如果它已經默認完成?如果我不需要這樣做,它會不會獲得成效?只是想知道......

+0

任何人都可以幫我的頭條?無法找到適合這一個:-S – theknut 2012-02-10 18:44:14

+0

我有一個本地結構,從未初始化,編譯沒有錯誤。今天,我創建了一個不同的結構,處理相同,得到「未初始化的局部變量錯誤」。 它的所有*成員*在使用前都被設置爲一個值,但我不能先將其設置爲空,因爲它只是一個結構。編譯的結構只包含ints,bools和字符串。給出錯誤的那個也包含DateTimes。 「MyStructType myStruct = new MyStructType();」殺死了錯誤。不是我第一次因爲錯過了幾個關卡而被咬傷。 – mickeyf 2016-06-02 19:14:18

回答

90

局部變量未初始化。你必須手動初始化它們。

成員被初始化,例如:

public class X 
{ 
    private int _tmpCnt; // This WILL initialize to zero 
    ... 
} 

但局部變量不是:

public static void SomeMethod() 
{ 
    int tmpCnt; // This is not initialized and must be assigned before used. 

    ... 
} 

所以,你的代碼必須是:

int tmpCnt = 0; 
if (name == "Dude") 
    tmpCnt++; 

所以長簡而言之,會員初始化,當地人不會。這就是爲什麼你得到編譯器錯誤。

+4

謝謝!不知道成員和當地人的區別+1 – theknut 2012-02-10 18:57:36

+1

@詹姆斯:你知道這是否僅僅是一個編譯器功能來防止這樣的錯誤,或者如果C#編譯器實際上延遲了聲明的本地內存分配直到賦值? (例如,在C++中,即使這種變量的值是不可預知的,使用未分配的變量也是「正常」。) – ybakos 2012-03-29 17:34:35

+2

編譯器功能可避免該錯誤。在聲明中分配了本地的內存(當然這只是引用類型的參考)。 – 2012-03-29 17:38:02

0

請參閱this thread有關未初始化的布爾,但它應該回答你的問題。

除非您調用其構造函數(新建)或爲其賦值,否則不會初始化局部變量。

0

局部變量不會自動初始化。這隻發生在實例級別的變量上。

如果您希望對它們進行初始化,您需要顯式初始化局部變量。在這種情況下(如鏈接文檔所解釋的),通過設置值0或使用new運算符。

你已經顯示的代碼確實嘗試使用變量tmpCnt的值之前它被初始化爲任何東西,編譯器正確地警告它。

0

默認值表僅適用於初始化變量。

每鏈接頁面,初始化的方法有以下兩種等價...

int x = 0; 
int x = new int(); 

在代碼中,你只是定義的變量,但從來沒有初始化的對象。

10

默認分配適用於類成員,但不適用於局部變量。正如Eric Lippert在this answer中解釋的那樣,默認情況下,微軟可能有初始化的本地化,但他們選擇不這樣做,因爲使用未分配的本地幾乎肯定是一個錯誤。

1

雖然值類型具有默認值並且不能爲null,但它們也需要顯式初始化才能使用。您可以將這兩條規則視爲並排規則。 值類型不能爲空==>編譯器保證。 如果你問怎麼樣?你得到的錯誤信息就是答案。一旦你調用它們的構造函數,它們就會以默認值進行初始化。

int tmpCnt; // not accepted 
int tmpCnt = new Int(); // defualt value applied tmpCnt = 0 
5

變量以下類別被分類爲初始未分配:最初未賦值結構變量的

  • 實例變量。
  • 輸出參數,包括結構實例構造函數的這個變量。
  • 局部變量,除了在catch子句或foreach語句中聲明的那些變量。

變量以下類別最初列爲分配

  • 靜態變量。
  • 類實例的實例變量。
  • 最初分配的結構變量的實例變量。
  • 數組元素。
  • 值參數。
  • 參考參數。
  • 在catch子句或foreach語句中聲明的變量。
0

局部變量沒有默認值。

在使用它們之前,必須明確指定它們。它減少了使用一個你認爲已經給出了合理價值的變量的機會,而實際上它有一些默認值。