2016-06-15 3 views
0

Beim Erstellen eines Elements, das IDisposable implementiert, Dispose() wird am Ende des using Block auch aufgerufen, wenn eine Ausnahme ausgelöst wird, wenn ich richtig bin.Werden Objekte, die im Konstruktor erstellt wurden, auch durch "using" gelöscht?

Wenn jedoch ein neues Element ClassB innerhalb des Konstruktors eines Einwegelements erstellt wird, wird das Objekt von ClassB ebenfalls entsorgt, wenn IDisposable implementiert ist?

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

Dies kann zu Klassen gelten, die Stream verwandt sind. Aber gilt das generell?

+4

Nr Sein im Konstruktor wird nicht erstellt, aber ** vor ** der Konstruktor. – dymanoid

+1

Es wäre verpatzt, wenn es so wäre. Sie könnten einen ClassB erstellen, der IDisposable implementiert und mit ungefähr so ​​vielen Schlüsselstrichen wie diese Frage testet. – Paparazzi

Antwort

5

ClassB würde nur entsorgt werden wenn die Entsorgungsmethode von ClassA Anrufe darüber entsorgen.

class ClassA : IDisposable 
{ 
    private ClassB b; 
    public ClassA (ClassB b) { this.b = b; } 
    public void Dispose() { this.b.Dispose(); } 
} 

Wenn es Sie braucht nicht werden separat darüber verfügen:

using (ClassB b = new ClassB()) 
using (ClassA a = new ClassA(b)) 
{ 
} 
+1

Selbst im ersten Fall würde eine Exception im 'ClassA'-Konstruktor dazu führen, dass die' ClassB'-Instanz verloren geht. – Servy

+0

Also keine Klasse besser vertrauen ... Gibt es eine Möglichkeit herauszufinden, ob eine Klasse auch andere Konstruktorparameter als das Dekompilieren hat? Streams scheinen das zu tun. Aber gibt es ein allgemeines Muster? – bytecode77

+0

@ bytecode77 Wenn es als Entsorgung der Ressource dokumentiert ist, gehen Sie davon aus, dass es darüber verfügt. Wenn es das nicht explizit angibt, gehe davon aus, dass dies nicht der Fall ist. – Servy

1

Kurze Antwort, nein. Wenn ClassBIDisposable implementiert, sollten Sie es in einem mit Block wickeln zu:

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

Denken Sie daran, dass alles, was Sie zu einem Konstruktor übergeben, oder jede andere Methode, die Parameter akzeptiert vor der Konstruktor oder Methode ausgewertet wird, ist aufgerufen.

Einige Klassen, wie StreamWriter macht mit einem Stream, wird alles, was durch den Konstruktor übergeben wird, entsorgen, aber es ist üblich, die Entsorgung an diejenigen, die tatsächlich das Objekt instanziiert belassen.

Verwandte Themen