是这样的:

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

我相信这不是一个return语句一个合适的地方,是什么呢?

有帮助吗?

解决方案

作为其他几个一般都指出,这是没有问题的。

这会导致你的问题的唯一情况是,如果你在using语句的中间返回,还返回使用变量。不过话说回来,这也将导致你问题,即使你没有回来,只是保持一个变量的引用。

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

正如坏

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

其他提示

这是完全细

您显然认为

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

被盲目地翻译成:

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

其中,无可否认的,将是一个问题,而且会使using语句,而毫无意义的---这就是为什么的不可以它做什么。

,编译器可确保控制离开块之前的对象被设置 - 不论它是如何离开块

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

using语句是只是语法糖try / finally块,并作为Grzenio说,这是罚款从try块返回了。

返回表达式将被评估,则该最后块将被执行,则该方法将返回。

这将完全正常工作,就如同在try{}finally{}的中间返回

这是完全可以接受的。 A 使用语句确保了IDisposable对象将被不管什么设置

MSDN

  

在使用语句确保处置是即使当您所呼叫的对象的方法发生异常调用。您可以通过将对象try块内,然后调用Dispose在finally块达到同样的效果;事实上,这是怎么使用语句是由编译器翻译。

代码波纹管示出了如何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' 被设置。结果

在设置在所述返回语句之后但在函数的退出之前被调用。

也许是不是100%正确,这是可以接受的...

如果你恰巧是嵌套usings和嵌套一个内返回,它可能不是安全的。

以此为一个示例:

using (var memoryStream = new MemoryStream())
{
    using (var textwriter = new StreamWriter(memoryStream))
    {
        using (var csv = new CsvWriter(textwriter))
        {
            //..write some stuff to the stream using the CsvWriter
            return memoryStream.ToArray();
        }
    }
}

我经过在一个DataTable被输出为csv。在中间的回报,这是写的所有行到流,但输出的CSV总是缺少一个行(或多个,这取决于缓冲区的大小)。这告诉我的东西没有被正确关闭。

正确的方法是,以确保所有先前usings被适当设置:

using (var memoryStream = new MemoryStream())
{
    using (var textwriter = new StreamWriter(memoryStream))
    {
        using (var csv = new CsvWriter(textwriter))
        {
            //..write some stuff to the stream using the CsvWriter
        }
    }

    return memoryStream.ToArray();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top