问题
When creating an element that implements IDisposable, Dispose() is called at the end of the using block also if an exception is thrown, if I'm correct.
However, when creating a new element of ClassB within the constructor of a disposable element, will the object of ClassB also be disposed if IDisposable is implemented?
using (ClassA a = new ClassA(new ClassB()))
{
}
This may apply to classes that are related to Stream. However, does this apply in general?
回答1:
ClassB would only be disposed if the dispose method of ClassA calls dispose on it.
class ClassA : IDisposable
{
private ClassB b;
public ClassA (ClassB b) { this.b = b; }
public void Dispose() { this.b.Dispose(); }
}
If it doesn't you'll need to dispose of it separately:
using (ClassB b = new ClassB())
using (ClassA a = new ClassA(b))
{
}
回答2:
Short answer, no. If ClassB implements IDisposable, you should wrap it in a using block too:
using (var b = new ClassB())
using (var a = new ClassA(b))
{
// do stuff
}
Keep in mind that everything you pass to a constructor, or any other method which accepts parameters is evaluated before the constructor or method is invoked.
Some classes, like StreamWriter does with a Stream, will dispose whatever is passed through the constructor, but it's common to leave the disposing to whoever actually instantiated the object.
来源:https://stackoverflow.com/questions/37836565/does-using-also-dispose-objects-created-in-the-constructor