2016-06-15 2 views
0

При создании элемента, который реализует IDisposable, Dispose() вызывается в конце блока using также, если возникает исключение, если я прав.Использует ли «использование» объекты, созданные в конструкторе?

Однако при создании нового элемента ClassB внутри конструктора одноразового элемента, будет объект ClassB также быть расположен, если IDisposable реализуется?

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

Это может относиться к классам, которые связаны с Stream. Однако, применимо ли это вообще?

+4

No. Его не создается в конструкторе, но ** перед тем ** конструктор. – dymanoid

+1

Это было бы испорчено, если бы это произошло. Вы можете создать ClassB, которые реализуют IDisposable и тестируют с таким количеством клавиш, как этот вопрос. – Paparazzi

ответ

5

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)) 
{ 
} 
+1

Даже в первом случае исключение в конструкторе 'ClassA' приведет к утечке экземпляра' ClassB'. – Servy

+0

Так что лучше не доверять ни одному классу ... Есть ли способ узнать, обладает ли класс параметрами конструктора, отличными от декомпиляции? Потоки, похоже, это делают. Но есть ли общая схема? – bytecode77

+0

@ bytecode77 Если это задокументировано как распоряжение ресурсом, предположите, что оно его уничтожит. Если в нем явно не указано, что это так, предположите, что это не так. – Servy

1

Короткий ответ, нет. Если ClassB реализует IDisposable, вы должны обернуть его в использовании блока тоже:

using (var b = new ClassB()) 
using (var a = new ClassA(b)) 
{ 
    // do stuff 
} 

Имейте в виду, что все, что вы переходите к конструктору, или любой другой метод, который принимает параметры оценивается до того конструктора или метода является вызывается.

Некоторые классы, такие как StreamWriter, делают с Stream, будут располагать все, что передается через конструктор, но обычно оставляют распоряжение тем, кто фактически создавал объект.

Смежные вопросы