如其他地方所解释的那样,一个空的try
语句块也有一定的价值。
try{}
finally
{
..some code here
}
然而,像下面这样一个空的finally块有什么用处吗?
try
{
...some code here
}
finally
{}
编辑:请注意,我实际上没有检查CLR是否针对空的finally{}
生成任何代码。
如其他地方所解释的那样,一个空的try
语句块也有一定的价值。
try{}
finally
{
..some code here
}
try
{
...some code here
}
finally
{}
编辑:请注意,我实际上没有检查CLR是否针对空的finally{}
生成任何代码。
try
和finally
语句块中都没有代码时,finally
语句块就是无用的。引自MSDN
通过使用
finally
语句块,您可以清理在try
语句块中分配的任何资源,并且即使try
语句块中发生异常,也可以运行代码。
如果finally
语句块为空,则意味着您根本不需要此语句块。这还表明您的代码不完整(例如,这是DevExpress代码分析中使用的规则)。
实际上,很容易证明try-finally
语句中空的finally
块是无用的:
编译一个简单的控制台程序并使用以下代码:
static void Main(string[] args)
{
FileStream f = null;
try
{
f = File.Create("");
}
finally
{
}
}
打开已编译的dll文件,在IL反汇编器(或任何其他能够显示IL代码的工具)中查看,你会发现编译器只是简单地移除了try-finally
块:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 12 (0xc)
.maxstack 8
IL_0000: ldstr ""
IL_0005: call class [mscorlib]System.IO.FileStream [mscorlib]System.IO.File::Create(string)
IL_000a: pop
IL_000b: ret
} // end of method Program::Main
finally块用于执行无论是否抛出异常都应该发生的逻辑,例如关闭连接等。
因此,空的finally块没有任何用处。
try
块。为什么有人想要一个没有catch
或finally
的try
块是另一个问题。我不知道。实际上,当finally
块为空时,try/finally
完全从编译后的CIL中删除。也许在某些复杂的情况下,这样的代码与try
之外的代码编译方式不同。我不知道。 - Jakub Lortz