哪个更好,何时:使用语句或在C#中的IDisposable上调用Dispose()?

mke*_*y33 6 .net c# asp.net idisposable using-statement

假设我有以下内容:

using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
Run Code Online (Sandbox Code Playgroud)

为什么不做以下操作而失去几个花括号?:

var ctx = DataContextFactory.Create(0);
ctx.Dispose();
Run Code Online (Sandbox Code Playgroud)

感谢您的建议!

Mar*_*ell 26

第一个更好.它确保即使抛出异常也会处理它,并且它正确处理Create(0)返回null 的情况(即它不会尝试调用Dispose()null实例).

  • 没有人提到的另一个小问题是,使用"using"可以防止你在初始化之后但在处理之前意外地改变变量"ctx"的内容.您不希望意外地处置与您创建的对象不同的对象. (11认同)

Tre*_*son 7

一个using说法是,因为总是更好...

  • 你不能忘记打电话Dispose(),即使代码演变成不同的代码路径
  • Dispose()即使有异常也会被调用.它还会null在调用之前检查Dispose(),这可能很有用(假设您不仅仅是在调用new).

一个非显而易见的(对我来说,无论如何)技巧using是当你有多个一次性物体时如何避免过度嵌套:

using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
    input.copyTo(output);
}
Run Code Online (Sandbox Code Playgroud)

VS代码格式化程序将使两个语句从同一列开始.


事实上,在某些情况下,你甚至不必重复使用声明......

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))
Run Code Online (Sandbox Code Playgroud)

但是,在同一行上声明多个变量的限制适用于此类,因此类型必须相同,并且不能使用隐式类型var.