在finally块上使用未分配的局部变量

地亚哥

i在这个例子中什么时候可以取消分配?

int i;
try
{
    i = 2;
}
catch
{
    i = 3;
}
finally
{
    string a = i.ToString();
}
费耶舍科

例如,您可以在i = 2运行之前得到ThreadAbortException。 无论如何,C#编译器并不是特别聪明,因此很容易被人为弄乱上面的例子。它不必识别所有情况,如果不确定是否已分配,即使您确定,它也会抱怨。

编辑:我的第一个假设有点敏捷。因此,为了完善它,这就是我的想法。确保代码按顺序运行,否则,如果发生异常,它将跳转到处理程序。因此,如果在此之前发生异常,则i = 2可能不会运行。我仍然声称ThreadAbortException是发生这种情况的少数原因之一,即使您没有可以产生异常的代码也是如此。通常,如果您有许多不同的异常处理程序,则编译器无法事先知道将运行哪个异常处理程序。因此,它不会对此做出任何假设。可以知道如果1)只有1个catch块,而2)它是无类型的,那么只有这样,才能保证一个catch块可以运行。或者,如果有多个catch处理程序,并且您在每个处理程序中都分配了变量,它也可以工作,但是我想编译器也不在乎。看起来多么简单,这都是一种特殊情况,C#编译器团队倾向于忽略这些特殊情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章