假设我有以下内容:
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
为什么不直接执行以下操作并丢失几个花括号?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
感谢您的建议!
假设我有以下内容:
using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }
为什么不直接执行以下操作并丢失几个花括号?:
var ctx = DataContextFactory.Create(0);
ctx.Dispose();
感谢您的建议!
第一个更好。即使抛出异常,它也能确保它被释放,并且它正确处理Create(0)
返回 null 的情况(即它不会尝试调用Dispose()
null 实例)。
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。
尽可能使用using
Marc 引用的原因。OTOH 这不是脑死的解决方案,因为有时对象的生命周期不能定义为词法范围,因此请合理使用它。
唯一不想使用 using 块的地方是一次性对象的作用域在函数之外。在这种情况下,您的类应该实现 IDisposable 并在其 Dispose() 中处置该对象。
using 语句为您提供了很好的语法和异常保护。您不能在不调用 Dispose 的情况下离开 using 语句(它转换为调用 dispose 的 finally 块)。在第二种情况下,如果 Create 和 Dispose 之间有异常,则不会直接调用 dispose。除非您使用非托管资源,否则这不是问题,但如果使用,您将泄漏。