2010-08-11 128 views
2

为什么我不能在try块中分配对象变量?为什么我不能在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(); 
    } 
} 
+0

怎样去除设置关键字? – SteveCav 2010-08-11 03:08:45

+0

也许相关:http://stackoverflow.com/questions/94977/why-arent-variables-declared-in-try-in-scope-in​​-catch-or-finally – cofiem 2010-08-11 03:10:24

+0

我敢打赌,Jon Skeet会从无处出现,获得最佳答案奖。打哈欠。 – 2010-08-11 03:21:23

回答

12

更改您的声明DbConnection dbc = null;因此编译器能确切知道的变量分配。 (仅仅声明dbc是不一样为它指定一个null值,你必须明确与当地。)

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

有关详细信息,请参见有关明确分配的语言规范的第5.3节。

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

+0

如果它没有被赋值,这个变量肯定是空的吗? – CJ7 2010-08-11 03:11:14

+0

@克雷格,不,变量只是未分配的。 'null'并不构成缺少任务。 – 2010-08-11 03:12:21

+0

这是C#特有的吗?我不记得任何其他语言。 – CJ7 2010-08-11 03:13:49

1

更改此

DbConnection dbc; 

这个

DbConnection dbc = null; 
相关问题