关于c#:最后清空{}有用吗?

Empty finally{} of any use?

一个空的try有一些其他地方解释过的价值。

1
2
3
4
5
try{}
finally
{
   ..some code here
}

但是,最终是否有空的用途,例如:

1
2
3
4
5
6
try
{
   ...some code here
}
finally
{}

编辑:注意,我没有实际检查clr是否有为空finally{}生成的代码。


try-finally语句中的空finally块无效。来自MSDN

By using a finally block, you can clean up any resources that are
allocated in a try block, and you can run code even if an exception
occurs in the try block.

如果finally语句为空,则意味着您根本不需要这个块。它还可以显示代码不完整(例如,这是devexpress在代码分析中使用的规则)。

实际上,很容易证明try-finally语句中的空finally块是无用的:

用这个代码编译一个简单的控制台程序

1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args)
{
    FileStream f = null;
    try
    {
        f = File.Create("");
    }
    finally
    {
    }
}

在il disassembler(或任何其他可以显示il代码的工具)中打开编译后的dll,您将看到编译器只是删除了try-finally块:

1
2
3
4
5
6
7
8
9
10
.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块是没有意义的。