哪个更好,何时:使用语句或在C#中的IDisposable上调用Dispose()?
假设我有以下内容:
using(var ctx = DataContextFactory.Create(0)) { ... Some code ... }
为什么不做以下操作而失去几个花括号?:
var ctx = DataContextFactory.Create(0); ctx.Dispose();
感谢您的建议!
第一个更好。 它确保即使抛出exception也会处理它,并且它正确处理Create(0)
返回null的情况(即它不会尝试在null实例上调用Dispose()
)。
using
声明总是更好,因为……
- 你不能忘记调用
Dispose()
,即使代码演变成不同的代码路径 - 即使存在exception,也会调用
Dispose()
。 它还会在调用Dispose()
之前检查null
,这可能很有用(假设您不只是调用new
)。
使用的一个非显而易见的(对我而言)技巧是当你有多个一次性对象时如何避免过度嵌套:
using (var input = new InputFile(inputName)) using (var output = new OutputFile(outputName)) { input.copyTo(output); }
VS代码格式化程序将使两个语句从同一列开始。
事实上,在某些情况下,你甚至不必重复使用声明……
using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))
但是,在同一行上声明多个变量的限制适用于此类,因此类型必须相同,并且不能使用隐式类型var 。
尽可能使用Marc引用的原因。 OTOH这不是一个脑死亡的解决方案,因为有时候对象的生命周期不能被定义为词法范围,所以要合理地使用它。
您不想使用using块的唯一地方是一次性对象在function之外的范围。 在这种情况下,您的类应该实现IDisposable并在其Dispose()中处理该对象。
using语句为您提供了良好的语法和exception保护。 您不能在不调用Dispose的情况下离开using语句(它会转换为带有dispose调用的finally块)。 在第二个场景中,如果在Create和Dispose之间有exception,则不会直接调用dispose。 除非您使用非托管资源,否则这不是问题,但如果您使用,则会泄漏。