2012-02-17 149 views
2

請告訴我使用Try段內的一個變量的differenc和閉鎖段變量在嘗試捕捉異常

string curNamespace; 

try 
{ 
    curNamespace = "name"; // Works fine 
} 
catch (Exception e) 
{ 
// Shows use of unassigned local variable 
throw new Exception("Error reading " + curNamespace, e); 

} 

如果我使用try部分內部變量它編譯罰款,在保持部分我得到「未分配使用變量」

+0

**未賦值的變量的使用**是,如果你選擇,你可以忽略警告。否則問題就很清楚了。在嘗試使用** curNamespace **之前,您不要指定一個值,以便設置一個值。我真的建議,而不是設置它的String.Empty到** **空 – 2012-02-17 15:31:18

回答

8

編譯器是抱怨,因爲你可能會遇到前值被初始化異常。考慮下面的(很做作)例如:

string curNamespace; 
try { 
    throw new Exception("whoops"); 

    curNamespace = "name"; // never reaches this line 
} 
catch (Exception e) { 
    // now curNamespace hasn't been assigned! 
    throw new Exception("Error reading " + curNamespace, e); 

} 

的解決將是初始化curNamespacetry..catch之外的一些默認值。不過,不得不想知道你在嘗試使用它。

+0

雖然他說'*它編譯好*',所以它不是像你說的那樣抱怨的編譯器。 – Diego 2012-02-17 15:32:11

+1

@Diego在你的環境中試用它。對於VS 2010和.NET 4,編譯器默認情況下不允許這樣做。我想可以將它改爲警告 - 也許OP有。 – Yuck 2012-02-17 15:33:33

+0

@Yuck - 這個答案是「正確的」和「不正確的」編譯器抱怨的原因是因爲變量在使用前沒有被賦值。但是基於提供的代碼,它是初始化的(僅僅被分配一個值)。 – 2012-02-17 15:38:33

3

這意味着變量curNamespacecatch範圍使用它之前未初始化。

你的代碼改成這樣:

string curNamespace = null; 

它將編譯罰款。

C#,變量必須在使用前進行初始化。所以這是錯誤的:

string curNamespace; // variable was not initialized 
throw new Exception("Error reading " + curNamespace); // can't use curNamespace because it's not initialized 
+1

這是不正確巴勃羅。 'curNamespace'是在try-catch塊外部定義的,因此它在try catch內部是可訪問的。 – Diego 2012-02-17 15:29:33

+1

不知道爲什麼這是downvoted,這是正確的。編譯器無法在「catch」中使用之前明確證明變量已被分配。 – 2012-02-17 15:30:09

+1

@Diego,被*定義*並被*明確賦值*是兩個不同的東西。巴勃羅的回答沒有提及定義。 – 2012-02-17 15:30:59

2

你必須在try塊外分配它。

 string curNamespace = string.Empty; // or whatever 

     try 
     { 
      curNamespace = "name"; 
     } 
     catch (Exception e) 
     { 
      throw new Exception("Error reading " + curNamespace, e); 
     } 
0

你必須先初始化curNamespace。或者它可以在catch分支中未初始化。

+0

根據作者的示例代碼,它不可能被初始化(這很清楚)。它在使用之前從未被分配過一個值。這只是一個警告,在示例代碼的情況下可以忽略。 – 2012-02-17 15:37:42

+0

@Ramhound,你似乎在使用「初始化」來表示「已定義」。這不是正確的用法。就這個用法而言,初始化本質上是分配的。 – 2012-02-17 15:48:57

0

您,是因爲它不能保證當它使用的變量會擁有一些東西賦給變量。

你可以這樣做:

串curNamespace =的String.Empty;

0

如果您改變的curNamespace申報和分配的東西,它會工作:

string curNamespace = null; /* ASSIGN SOMETHING HERE */ 
try 
{ 
    curNamespace = "name"; 
} 
catch (Exception e) 
{ 
throw new Exception("Error reading " + curNamespace, e); 

}