【问题标题】:Empty finally{} of any use?清空最后{}有什么用?
【发布时间】:2025-12-02 12:35:01
【问题描述】:

一个空的try 有一些价值,正如elsewhere 所解释的那样

try{}
finally
{ 
   ..some code here
}

但是,finally 是否有任何用处,例如:

try
{
   ...some code here
}
finally
{}

编辑:请注意,我实际上并没有检查 CLR 是否为空 finally{} 生成任何代码

【问题讨论】:

  • 我认为它没有任何意义。正如问题中所解释的,您指出您希望进行空尝试,最后使用代码,是在线程中止之前做一些事情。但是无论线程是否中止,empty finally 都不会执行任何操作。
  • 不这么认为..blank终于没有用例了。
  • 它允许您使用try 块,而无需对方法进行任何功能更改。为什么有人想要一个没有catchfinallytry 块是另一个问题。我不知道。实际上,当finally 块为空时,try/finally 已从编译的 CIL 中完全删除。当此类代码的编译方式与try 之外的代码不同时,可能存在一些复杂的情况。我不知道他们。

标签: c# try-finally


【解决方案1】:

try-finally 语句中的空 finally 块是没有用的。来自MSDN

通过使用 finally 块,您可以清理任何资源 在 try 块中分配,即使出现异常也可以运行代码 发生在 try 块中。

如果finally 语句为空,则表示你根本不需要这个块。它还可以表明您的代码不完整(例如,这是 DevExpress 在代码分析中使用的the rule)。

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

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

static void Main(string[] args)
{
    FileStream f = null;
    try
    {
        f = File.Create("");
    }
    finally
    {
    }
}

在 IL Disassembler(或任何其他可以显示 IL 代码的工具)中打开已编译的 dll,您会看到编译器只是删除了 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

【讨论】:

  • 问题是empty finally 的使用,例如empty try。这并不是他最终在代码中发现空的原因。
  • @Marshal 我已经扩展了答案以更详细地解释我的观点。我希望,现在我的答案更清楚了。
【解决方案2】:

finally 块用于执行无论是否抛出异常都应该始终发生的逻辑,例如关闭连接等。

因此,拥有一个空的 finally 块是没有意义的。

【讨论】:

    最近更新 更多