假设我有以下几种:

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 (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2))

然而,限制宣布的多个变量在同一线路上适用于这里这样的类型必须相同,不能使用隐含的类型 var.

如果可以,请使用使用,以了解Marc引用的原因。 OTOH这不是一个脑死亡的解决方案,因为有时候对象的生命周期不能被定义为词法范围,所以要合理地使用它。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top