6

假设我有以下内容:

using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }

为什么不直接执行以下操作并丢失几个花括号?:

var ctx = DataContextFactory.Create(0);
ctx.Dispose();

感谢您的建议!

4

5 回答 5

26

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

于 2009-06-23T19:30:04.583 回答
7

using陈述总是更好,因为...

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

一个不明显的(无论如何对我来说)技巧using是当你有多个一次性对象时如何避免过度嵌套:

using (var input = new InputFile(inputName))
using (var output = new OutputFile(outputName))
{
    input.copyTo(output);
}

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


事实上,在某些情况下,您甚至不必重复 using 语句......

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))

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

于 2009-06-23T19:36:59.080 回答
3

尽可能使用usingMarc 引用的原因。OTOH 这不是脑死的解决方案,因为有时对象的生命周期不能定义为词法范围,因此请合理使用它。

于 2009-06-23T19:33:34.063 回答
3

唯一不想使用 using 块的地方是一次性对象的作用域在函数之外。在这种情况下,您的类应该实现 IDisposable 并在其 Dispose() 中处置该对象。

于 2009-06-23T19:35:53.793 回答
2

using 语句为您提供了很好的语法和异常保护。您不能在不调用 Dispose 的情况下离开 using 语句(它转换为调用 dispose 的 finally 块)。在第二种情况下,如果 Create 和 Dispose 之间有异常,则不会直接调用 dispose。除非您使用非托管资源,否则这不是问题,但如果使用,您将泄漏。

于 2009-06-23T19:31:48.527 回答