最近我看到一些代码编写如下:
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看,它看起来像你还需要治疗_myDisposableField为IDisposable直接.如果任何类型显式实现IDisposable接口并且同时提供方法,这将是重要的.public void Dispose()
此代码也不会尝试复制try-finally使用时存在的代码using,但有人认为这被认为是不必要的.正如迈克尔·格拉克齐克在评论中指出,但是,使用的finally抗异常所提供的保护,特别是ThreadAbortException(这可能在任何时候发生).也就是说,实际发生这种情况的窗口非常小.
虽然,我对他们这样做的事实感兴趣,但并没有真正理解它给予他们的微妙"好处".
| 归档时间: |
|
| 查看次数: |
2402 次 |
| 最近记录: |