-
20-08-2019 - |
题
是这样的:
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();
}