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#编译器团队倾向于忽略这些特殊情况.