"using" 是否也处理在构造函数中创建的对象?
Does "using" also dispose objects created in the constructor?
创建实现 IDisposable
的元素时,如果抛出异常,也会在 using
块的末尾调用 Dispose()
,如果我是正确的话。
但是在一次性元素的构造函数中创建ClassB
的新元素时,如果实现了IDisposable
,ClassB的对象是否也会被丢弃?
using (ClassA a = new ClassA(new ClassB()))
{
}
这可能适用于与 Stream
相关的 类。 但是,这是否普遍适用?
简答,没有。如果 ClassB
实现了 IDisposable
,你也应该将它包装在一个 using 块中:
using (var b = new ClassB())
using (var a = new ClassA(b))
{
// do stuff
}
请记住,传递给构造函数或任何其他接受参数的方法的所有内容都会在调用构造函数或方法之前进行评估。
有些 类,例如 StreamWriter
对 Stream
所做的,将处理通过构造函数传递的任何内容,但通常将处理留给实际实例化该对象的人。
ClassB
只会被处置 如果 ClassA
的处置方法调用处置它。
class ClassA : IDisposable
{
private ClassB b;
public ClassA (ClassB b) { this.b = b; }
public void Dispose() { this.b.Dispose(); }
}
如果没有,您需要单独处理它:
using (ClassB b = new ClassB())
using (ClassA a = new ClassA(b))
{
}
创建实现 IDisposable
的元素时,如果抛出异常,也会在 using
块的末尾调用 Dispose()
,如果我是正确的话。
但是在一次性元素的构造函数中创建ClassB
的新元素时,如果实现了IDisposable
,ClassB的对象是否也会被丢弃?
using (ClassA a = new ClassA(new ClassB()))
{
}
这可能适用于与 Stream
相关的 类。 但是,这是否普遍适用?
简答,没有。如果 ClassB
实现了 IDisposable
,你也应该将它包装在一个 using 块中:
using (var b = new ClassB())
using (var a = new ClassA(b))
{
// do stuff
}
请记住,传递给构造函数或任何其他接受参数的方法的所有内容都会在调用构造函数或方法之前进行评估。
有些 类,例如 StreamWriter
对 Stream
所做的,将处理通过构造函数传递的任何内容,但通常将处理留给实际实例化该对象的人。
ClassB
只会被处置 如果 ClassA
的处置方法调用处置它。
class ClassA : IDisposable
{
private ClassB b;
public ClassA (ClassB b) { this.b = b; }
public void Dispose() { this.b.Dispose(); }
}
如果没有,您需要单独处理它:
using (ClassB b = new ClassB())
using (ClassA a = new ClassA(b))
{
}