是"使用"还处理在构造函数中创建的对象?

时间:2016-06-15 13:15:41

标签: c# .net idisposable using-statement

创建实现IDisposable的元素时,如果抛出异常,Dispose()块的末尾也会调用using,如果我正确的话。

但是,在一次性元素的构造函数中创建ClassB的新元素时,是否会在实现IDisposable时处理ClassB的对象?

using (ClassA a = new ClassA(new ClassB()))
{
}

这可能适用于与Stream相关的课程。 但是,这一般适用吗?

2 个答案:

答案 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
}

请记住,传递给构造函数的任何内容或接受参数的任何其他方法都会在调用构造函数或方法之前进行评估。

某些类,如StreamWriterStream一样,将处理通过构造函数传递的任何内容,但将处理留给实际实例化该对象的任何人都是常见的。