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

 炫彩十字绣I_775 发布于 2023-02-11 14:52

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

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

fejesjoco.. 6

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

编辑:我的第一次假设有点快.所以要改进它,这就是我的想法.代码保证按顺序运行,或者如果发生异常,它将跳转到处理程序.因此,如果在此之前发生异常,则i = 2可能无法运行.我仍然声称ThreadAbortException是导致这种情况发生的几个原因之一,即使你没有可能产生异常的代码.通常,如果您有任意数量的异常处理程序,则编译器无法预先知道将运行哪个异常处理程序.所以它不会试图对此做出任何假设.它可以知道如果1)只有1个catch块而2)它是无类型的,那么,只有这样,才能保证一个catch块运行.或者,如果有多个catch处理程序,并且您在每个处理程序中分配了变量,它也可以工作,但我想编译器也不关心它.看起来很简单,这是一个特例,C#编译器团队倾向于忽略这些特殊情况.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有