在Dispose中清空"using"语句

Dav*_*ier 20 c#

最近我看到一些代码编写如下:

public void Dipose()
{
   using(_myDisposableField) { }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪,我更愿意看到 myDisposableField.Dispose();

有什么理由使用"使用"来处理您的对象而非明确地进行调用?

Ada*_*rth 23

不,没有.它只会编译成一个空的try/finally并最终调用Dispose.

去掉它.您将使代码更快,更具可读性,并且可能最重要的是(在下面继续阅读时)其意图更具表现力.

更新:它们有点聪明,等效代码需要空检查,根据Jon Skeet的建议,如果涉及多线程,也会采用本地副本(与标准事件调用模式相同,以避免在null之间发生争用检查和方法调用).

IDisposable tmp = _myDisposableField; 

if (tmp != null) 
    tmp.Dispose();
Run Code Online (Sandbox Code Playgroud)

从我可以在我写了一个示例应用程序的IL看,它看起来像你还需要治疗_myDisposableFieldIDisposable直接.如果任何类型式实现IDisposable接口并且同时提供方法,这将是重要的.public void Dispose()

此代码也不会尝试复制try-finally使用时存在的代码using,但有人认为这被认为是不必要的.正如迈克尔·格拉克齐克在评论中指出,但是,使用的finally抗异常所提供的保护,特别是ThreadAbortException(这可能在任何时候发生).也就是说,实际发生这种情况的窗口非常小.

虽然,我对他们这样做的事实感兴趣,但并没有真正理解它给予他们的微妙"好处".

  • @JonSkeet True.但话说回来,在这两种情况下,通用性都是在没有评论的情况下打击负责这样做的开发人员. (5认同)
  • 我不确定如何解析它.在没有评论的情况下,你是否{打他们这样做},或者你为了{做这个没有评论}打他们?:) (2认同)
  • @Jon两个,他们应该得到两次打击.正手和反手:-P (2认同)