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

苏尼尔

问题:在using语句内声明using语句的目标对象是否有好处,如下面的“代码片段1”所示?

“代码段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:似乎在实例化TextWriter对象的第一行发生异常时,“代码段3”可能最终会导致资源没有被处置。因此,前两个代码段在资源分配方面似乎是等效的,而第三代码段绝对不建议使用,除非第三个代码段具有将要处理TextWriter对象的finally块。

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

彼得·杜尼奥(Peter Duniho)

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章