使用未分配的局部变量和try-catch-finally

时间:2017-02-17 00:59:32

标签: c# .net

下面的示例代码在编译时给出了“使用未分配的局部变量'resultCode'”:

    string answer;
    string resultCode;

    try
    {
        resultCode = "a"; 
    }
    catch
    {
        resultCode = "b";
    }
    finally
    {
        answer = resultCode;
    }

我原以为上面的catch块应该捕获所有异常,因此在输入finally块的时候不能取消分配resultCode。任何人都能解释一下吗? 感谢。

编辑:谢谢大家。这个引用文档的答案似乎很好地回答了这个问题:https://stackoverflow.com/a/8597901/70140

4 个答案:

答案 0 :(得分:3)

举例说明:

string answer;
string resultCode;

try
{
    // anything here could go wrong
}
catch
{
    // anything here could go wrong
}
finally
{
    answer = resultCode;
}

此时编译器不能假设或保证resultCode曾被赋予一个值。因此,它警告您可能会使用未分配的变量。

答案 1 :(得分:1)

添加一些解释,例如,在以下代码中,变量n在try块内初始化。尝试在Write(n)语句中的try块之外使用此变量将生成编译器错误。

int n;  
try   
{  
    int a = 0; // maybe a throw will happen here and the variable n will not initialized
    // Do not initialize this variable here.  
    n = 123;  
}  
catch  
{  
}  
// Error: Use of unassigned local variable 'n'.  
Console.Write(n);  

正如评论中所建议的那样,如果您同时在TryCatch中分配,请尝试在块之后进行分配

 string answer;
 string resultCode;

 try
 {
    resultCode = "a";
 }
 catch
 {
    resultCode = "b";
 }
 finally
 {
     // answer = resultCode;
 }
 answer = resultCode;

它会编译。

答案 2 :(得分:0)

编译器无法保证trycatch块中的任何代码实际运行时都不会发生异常。理论上,当您尝试使用它时,resultCode的值为未分配。

答案 3 :(得分:0)

Visual Studio不知道您正在分配' resultCode'一个值。你需要事先给它一个值。底部的示例代码。

这是一个层次结构。 Visual Studio没有看到' resultCode'的定义。在try / catch中。

string answer = "";
string resultCode = "";

try
{
    resultCode = "a"; 
}
catch
{
    resultCode = "b";
}
finally
{
    answer = resultCode;
}