Using语句和IDisposable接口
本文关键字:接口 IDisposable 语句 Using | 更新日期: 2023-09-27 18:25:26
在using语句中声明的变量确实是因为在using块的范围内而一起处理的吗?
我需要做什么:
using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
{
}
}
还是这就足够了,"bar"answers"foo"一起处理?
using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
}
还是这就足够了,"bar"answers"foo"一起处理?
不,酒吧不会被处理。
using
语句转换为try-finally
块,因此即使发生异常,finally
块也会确保对Dispose
方法的调用。
之后
using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
}
转换为
{
SomeIdisposableImplementation foo;
try
{
foo = new SomeIdisposableImplementation();
SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
}
finally
{
if (foo != null)
foo.Dispose();
}
}
使bar
处于未处置状态。
要用using语句同时处理它们,您不必嵌套它们,但是您可以编写这个
using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
{
using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
{
}
}
作为
using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation())
using(SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
{
}
在第二个版本中,bar将超出范围,但不会被处理。但您可以使用以下命令将foo和bar放在同一个位置:
using (SomeIdisposableImplementation foo = new SomeIdisposableImplementation(), SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2())
{
// use foo and bar
}
您也可以将变量放入using命令中:
SomeIdisposableImplementation foo = new SomeIdisposableImplementation();
SomeIdisposableImplementation2 bar = new SomeIdisposableImplementation2();
using (foo, bar)
{
// use foo and bar
}