2016-04-26 14 views
-1

Ist dies das richtige Muster zu folgen, d. H. Wenn meine Klasse Wegwerf-Mitglieder hat, muss ich explizit Dipose() auf jedem anrufen?Wenn meine Klasse ein SqlConnection (oder anderes verfügbares) Mitglied hat, sollte IDisposable implementiert werden?

class MyClass : IDisposable 
{ 
public MyClass() 
{ 
    conn = maybeCreateAConnection(); 
} 
public void Dispose() 
{ 
    if(conn!=null)conn.Dispose(); 
} 

private SqlConnection conn; 
} 
+1

[Muster löschen] (https://msdn.microsoft.com/en-us/library/b1yfkh5e (v = vs.110) .aspx), zuerst ** DO ** - "** DO ** implementieren Das Basic Dispose Pattern für Typen, die Instanzen von Disposable-Typen enthalten " –

+1

Ich würde fragen, warum Sie ein _member_ für die Verbindung benötigen - Verbindungen sollten schnell erstellt, verwendet und entsorgt werden. Es gibt selten einen zwingenden Grund, eine Verbindung für die Dauer einer Klasse aufrecht zu erhalten. –

+0

@Damien_The_Unbeliever Es scheint kludgy, mehr wie C++ muss sich erinnern, welche Felder sind Einweg! –

Antwort

2

Ja. Aber nur wenn die Klasse der Besitzer dieser Ressource ist. Sie möchten keine Verbindung trennen, die ein anderer Benutzer verwendet.

Und das hat übrigens nichts mit dem Garbage Collector zu tun.

+0

Wie kommt es? Entfernen Sie das Tag, wenn Sie möchten, obwohl es aussieht, als sei es ein Betrogener. –

+1

@ Mr.Boy 'Dispose' ist nur eine Methode wie jede andere, es hat keine Beziehung mit dem Garbage Collector. Der GC kümmert sich nur um Referenzen und Finalizer. Ein Finalizer * kann * eine Dispose-Methode aufrufen, aber das ist irrelevant - er kann auch jede andere Methode aufrufen, solange sie sicher ist. – Luaan

+0

Der Garbage Collector ist der Grund, .NET_has_ 'IDisposable'. Wenn wir den Speicher nicht verwaltet hätten und alle Ressourcen manuell freigegeben hätten, gäbe es keinen "IDisposable" - es würde einfach in den Destruktor (Finalizer) gehen. –

Verwandte Themen