当前位置:  开发笔记 > 编程语言 > 正文

在使用块的中间返回

如何解决《在使用块的中间返回》经验,为你挑选了6个好方法。

就像是:

using (IDisposable disposable = GetSomeDisposable())
{
    //.....
    //......
    return Stg();
}

我相信这不是回报声明的合适地方,是吗?



1> JaredPar..:

正如其他几个人一般指出的那样,这不是问题.

它会导致问题的唯一情况是,如果您在using语句的中间返回并另外返回in using变量.但话说回来,即使你没有返回并只是保留对变量的引用,这也会导致问题.

using ( var x = new Something() ) { 
  // not a good idea
  return x;
}

同样糟糕

Something y;
using ( var x = new Something() ) {
  y = x;
}


@JohnShedletsky在这种情况下,你的函数调用应该用using包装.喜欢使用(Stream x = FuncToReturnStream()){...}而不使用FuncToReturnStream.

2> James Curran..:

这很好.

你显然在想

using (IDisposable disposable = GetSomeDisposable())
{
    //.....
    //......
    return Stg();
}

被盲目翻译成:

IDisposable disposable = GetSomeDisposable()
//.....
//......
return Stg();
disposable.Dispose();

诚然,这将是一个问题,并且会使using声明变得毫无意义 - 这就是为什么它不是它的作用.

编译器确保在控件离开块之前放置对象 - 无论它如何离开块.


我显然是.

3> Jon Skeet..:

这绝对没问题 - 完全没问题.为什么你认为这是错的?

using语句只是try/finally块的语法糖,正如Grzenio所说,从try块返回也没关系.

将评估返回表达式,然后将执行finally块,然后该方法将返回.


James Curran的回答解释了我的想法.

4> Grzenio..:

这将完美无缺,就像在中间返回一样 try{}finally{}



5> mbillard..:

这完全可以接受.一个使用语句确保了IDisposable对象将被无论什么配置.

来自MSDN:

using语句确保即使在对象上调用方法时发生异常,也会调用Dispose.您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是编译器如何翻译using语句.



6> 小智..:

下面的代码显示了如何using工作:

private class TestClass : IDisposable
{
   private readonly string id;

   public TestClass(string id)
   {
      Console.WriteLine("'{0}' is created.", id);
      this.id = id;
   }

   public void Dispose()
   {
      Console.WriteLine("'{0}' is disposed.", id);
   }

   public override string ToString()
   {
      return id;
   }
}

private static TestClass TestUsingClose()
{
   using (var t1 = new TestClass("t1"))
   {
      using (var t2 = new TestClass("t2"))
      {
         using (var t3 = new TestClass("t3"))
         {
            return new TestClass(String.Format("Created from {0}, {1}, {2}", t1, t2, t3));
         }
      }
   }
}

[TestMethod]
public void Test()
{
   Assert.AreEqual("Created from t1, t2, t3", TestUsingClose().ToString());
}

输出:

't1'已创建.
't2'已创建.
't3'已创建.
'创建从t1,t2,t3'创建.
"t3"被处理掉了.
"t2"被处理掉了.
"t1"被处理掉了.

在return语句之后但在函数退出之前调用dispos.

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有