创建实现IDisposable
的元素时,如果抛出异常,Dispose()
块的末尾也会调用using
,如果我正确的话。
但是,在一次性元素的构造函数中创建ClassB
的新元素时,是否会在实现IDisposable
时处理ClassB的对象?
using (ClassA a = new ClassA(new ClassB()))
{
}
这可能适用于与Stream
相关的课程。 但是,这一般适用吗?
答案 0 :(得分:5)
CustomException
只有如果 ClassB
调用处置方法才会被处置。
ClassA
如果它不是你需要单独处理它:
class ClassA : IDisposable
{
private ClassB b;
public ClassA (ClassB b) { this.b = b; }
public void Dispose() { this.b.Dispose(); }
}
答案 1 :(得分:1)
简短的回答,没有。如果ClassB
实现IDisposable
,您也应该将其包装在使用块中:
using (var b = new ClassB())
using (var a = new ClassA(b))
{
// do stuff
}
请记住,传递给构造函数的任何内容或接受参数的任何其他方法都会在调用构造函数或方法之前进行评估。
某些类,如StreamWriter
与Stream
一样,将处理通过构造函数传递的任何内容,但将处理留给实际实例化该对象的任何人都是常见的。