在 C# 语句外部声明 using 语句的目标对象



问题:在下面的"代码片段 1"中,在 using 语句中声明 using 语句的目标对象是否有好处?

"代码片段

2"和"代码片段 3"片段对我来说似乎也有效,但不确定第一个代码片段是否比其他两个代码片段有一些好处。

代码片段 1

 using (TextWriter w = File.CreateText("log.txt")) {
     w.WriteLine("This is line one");
     w.WriteLine("This is line two");
  }

代码片段 2

 TextWrite w = null;
 using (w = File.CreateText("log.txt")) {
     w.WriteLine("This is line one");
     w.WriteLine("This is line two");
  }

代码片段 3

 TextWriter w = File.CreateText("log.txt");
 using (w) {
     w.WriteLine("This is line one");
     w.WriteLine("This is line two");
  }

更新 1:似乎"代码片段 3"最终可能会导致在实例化 TextWriter 对象时第一行发生异常时未释放资源。因此,前两个代码段在资源处置方面似乎是等效的,而第三个代码段绝对不建议使用,除非第三个代码段有一个 finally 块,其中 TextWriter 对象正在被释放。

更新

2:在得到彼得的回答后,我意识到我在更新1中的观察是不正确的。 解释如下:如果在 3 个代码段中的任何一个中实例化 TextWriter 时发生异常,则永远不会调用 Dispose 方法,因为没有要调用此方法的 TextWriter 对象。

您的示例 #2 和 #3 是等效的,与您在">UPDATE 1"中的假设相反。如果在 File.CreateText() 方法调用中发生异常,则不会返回任何对象并将其分配给 w 。因此,无论您是在 using 语句之前还是作为该语句的一部分进行该赋值,如果成功创建对象,都将根据需要成功清理该对象。

也就是说,示例 #1 是有益的,至少有两个原因:

  1. 如另一个答案所述,它缩小了变量的范围,使其只能在using语句块中访问。这很有用,原因与作用域变量在任何情况下都很有用的原因相同。
  2. 另一个好处(恕我直言,这是最重要的好处之一(是声明为using语句一部分的变量是只读的。这可确保您不会意外编写代码,尝试在清理一次性对象之前切换该对象,即创建一种模棱两可的情况,即 using 语句仅清理一个一次性对象。

唯一的潜在好处是降低了声明变量的可见性(因为它仅在using块中可见(和可读性。

最新更新