假设我有一个一次性对象MyDisposable
,它将另一个一次性对象作为构造函数参数。
using(MyDisposable myDisposable= new MyDisposable(new AnotherDisposable()))
{
//whatever
}
假设myDisposable
没有将AnotherDisposable
置于其处置方法中。
这只能正确处理myDisposable
吗?或者它也处理AnotherDisposable
?
答案 0 :(得分:9)
using
相当于
MyDisposable myDisposable = new MyDisposable(new AnotherDisposable());
try
{
//whatever
}
finally
{
if (myDisposable != null)
myDisposable.Dispose();
}
因此,如果myDisposable
未在AnotherDisposable
上调用Dispose,则using
也不会调用它。
答案 1 :(得分:5)
为什么不嵌套呢?
using(var outer = new AnotherDisposable())
{
using(var inner = new MyDisposable(outer))
{
//whatever
}
}
现在至少你可以确定它们会被正确处理掉。
答案 2 :(得分:1)
它没有“处置”任何东西。它调用其中使用的对象的Dispose
方法。你的工作是清理其他任何东西......也许是通过调用另一个对象上的处理。
答案 3 :(得分:0)
在这种情况下,它不会处置AnotherDisposable
。有两种解决方案。
首先,您通常会做以下事情:
using (AnotherDisposable anotherDisposable = new AnotherDisposable())
using (MyDisposable myDisposable= new MyDisposable(anotherDisposable))
{
}
但是,还有不同的方法。通常情况下,当一个人使用一次性用品时,它本身会负责处理所用的物品。例如。包裹StreamReader
的{{1}}会处理它所包含的Stream
。这意味着您选择的构造将起作用。您可以在Stream
中实现相同的功能,然后您采用的方法就可以了。
答案 4 :(得分:0)
C#的using语句提供了一个用于调用Dispose on objects的语法快捷方式 使用try / finally块实现IDisposable。例如:
using (FileStream fs = new FileStream ("myFile.txt", FileMode.Open))
{
// ... Write to the file ...
}
编译器将其转换为: FileStream fs = new FileStream(“myFile.txt”,FileMode.Open);
try
{
// ... Write to the file ...
}
finally
{
if (fs != null) ((IDisposable)fs).Dispose();
}
finally块确保即使出现异常也会调用Dispose方法 抛出,1或代码提前退出块。
因此,使用单个块只会确保处理单个一次性对象。另一方面,您可以使用嵌套的using语句。喜欢
using (myDisposable d = new myDisposable())
{
using(Disposable2 d2 = new Disposable2())
{
// do something and dispose...
}
}
,这将转换为
try
{
// work around for myDisposable
try
{
// work around for Disposable2
}
finally
{
if (d2 != null)
((IDisposable)d2 ).Dispose();
}
}
finally
{
if (d!= null)
((IDisposable)d).Dispose();
}
答案 5 :(得分:0)
您只在using
语句中初始化了一个一次性变量。 AnotherDisposable
嵌套对象是通过正常初始化而不是using
创建的。因此,只有您使用myDisposable
语句创建的using
变量才会自动处理。