taf*_*afa 183 c# dispose idisposable using-statement
就像是:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Run Code Online (Sandbox Code Playgroud)
我相信这不是回报声明的合适地方,是吗?
Jar*_*Par 186
正如其他几个人一般指出的那样,这不是问题.
它会导致问题的唯一情况是,如果您在using语句的中间返回并另外返回in using变量.但话说回来,即使你没有返回并只是保留对变量的引用,这也会导致问题.
using ( var x = new Something() ) {
// not a good idea
return x;
}
Run Code Online (Sandbox Code Playgroud)
同样糟糕
Something y;
using ( var x = new Something() ) {
y = x;
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*ran 132
这很好.
你显然在想
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Run Code Online (Sandbox Code Playgroud)
被盲目翻译成:
IDisposable disposable = GetSomeDisposable()
//.....
//......
return Stg();
disposable.Dispose();
Run Code Online (Sandbox Code Playgroud)
诚然,这将是一个问题,并且会使using声明变得毫无意义 - 这就是为什么它不是它的作用.
编译器确保在控件离开块之前放置对象 - 无论它如何离开块.
Jon*_*eet 91
这绝对没问题 - 完全没问题.为什么你认为这是错的?
using语句只是try/finally块的语法糖,正如Grzenio所说,从try块返回也没关系.
将评估返回表达式,然后将执行finally块,然后该方法将返回.
小智 11
下面的代码显示了如何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());
}
Run Code Online (Sandbox Code Playgroud)
输出:
't1'已创建.
't2'已创建.
't3'已创建.
'创建从t1,t2,t3'创建.
"t3"被处理掉了.
"t2"被处理掉了.
"t1"被处理掉了.
在return语句之后但在函数退出之前调用dispos.
| 归档时间: |
|
| 查看次数: |
44289 次 |
| 最近记录: |