为什么我不能在try块中分配对象变量?

时间:2010-08-11 03:06:58

标签: c# try-catch-finally

为什么我不能在try块中分配对象变量?

如果我尝试这样做并清理finally块中的变量,我会收到编译器错误:“使用未分配的局部变量”。这没有任何意义,因为变量是在try块之前声明的,而在finally块中我首先检查变量是否为null

为什么以下代码无法编译?我正在检查dbc是否null,因此没有机会尝试使用未分配的变量。

例如:

DbConnection dbc;
try {
    dbc = <some method call returning an open DbConnection>
    // do stuff
} catch (Exception e) { // do stuff }
finally { 
    if (dbc != null) {
        dbc.Close();
    }
}

2 个答案:

答案 0 :(得分:12)

将您的声明更改为DbConnection dbc = null;,以便编译器可以确定已分配变量。 (仅仅声明 dbc与为其赋值null不同,您必须明确地使用本地。)

现有代码失败的原因是在设置dbc之前完全可能发生异常。因此,编译器不能假定在finally块执行时分配dbc。

有关详细信息,请参阅明确赋值的语言规范第5.3节。

http://msdn.microsoft.com/en-us/library/aa691172(VS.71).aspx

答案 1 :(得分:1)

更改此

DbConnection dbc;

到这个

DbConnection dbc = null;