哪个更好,何时:使用语句或在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。 除非您使用非托管资源,否则这不是问题,但如果您使用,则会泄漏。