2012-02-17 105 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); 

}