Hallo,
zunächst mal möchte ich eine Beispielklasse aus VB.NET zeigen:
Imports SharpDX.WIC
Public Class ResourceFactory
Implements IDisposable
Private _ImagingFactory As New ImagingFactory
#Region "IDisposable Support"
Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe
' IDisposable
Protected Overridable Sub Dispose(disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: Verwalteten Zustand löschen (verwaltete Objekte).
End If
' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalize() unten überschreiben.
' TODO: Große Felder auf NULL festlegen.
End If
Me.disposedValue = True
End Sub
' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt.
'Protected Overrides Sub Finalize()
' ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein.
' Dispose(False)
' MyBase.Finalize()
'End Sub
' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster richtig zu implementieren.
Public Sub Dispose() Implements IDisposable.Dispose
' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(disposing As Boolean) Bereinigungscode ein.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Region
End Class
ImagingFactory ist ein Objekt aus der SharpDX Bibliothek und die Region "IDisposable Support" fügt Visual Studio selbstständig inkl. der Kommentare so ein wenn man IDisposable in seiner Klasse implementiert.
ImagingFactory aus SharpDX stellt einen Dispose-Aufruf bereit, aber wie muss ich in dem Zusammenhang denn nun die von Visual-Studio hinzugefügten Kommentare verstehen:
Da SharpDX ein Wrapper für native COM-Interfaces ist, ist mir nun nicht klar ob ich das _ImagingFactory.Dispose in dem ToDo für verwaltete oder für unverwaltete Objekte (mit überschreiben von Finalize) schreiben muss.
Ich würde nun tippen das ich Finalize überschreiben muss und das Dispose in dem ToDo für unverwaltete Ressourcen unterbringen muss, aber trotz längerer Suche im Internet bin ich mir da unklar.
Mag mir da jemand ein paar Erklärungen zu schreiben?
Vielen Dank für alle Antworten im voraus,
Astrix
Hallo Astrix,
Mag mir da jemand ein paar Erklärungen zu schreiben?
warum nochmal schreiben, wenn es die allgemeinen Erklärungen schon an anderer Stelle geschrieben gibt? Siehe Dispose implementieren und verwenden (IDisposable).
Da SharpDX ein Wrapper für native COM-Interfaces ist, ist mir nun nicht klar ob ich das _ImagingFactory.Dispose in dem ToDo für verwaltete oder für unverwaltete Objekte (mit überschreiben von Finalize) schreiben muss.
Bei konkreten Fragen sieht das natürlich anders aus. Wobei sich auch deren Antwort eigentlich automatisch ergibt. Ein Wrapper ist ja eine verwaltete Klasse (die intern unverwaltete Ressourcen verwendet). Wenn der Wrapper IDisposable korrekt implementiert - und das sollte er -, dann braucht dich nicht zu kümmern, welche Ressourcen er benutzt (die muss und wird er selbst freigeben, wenn sein Dispose aufgerufen wird). Also klarer Fall: Das _ImagingFactory.Dispose gehört in den Teil für die verwalteten Ressourcen.
herbivore
Grundsätzlich gilt für Finalizer (afaik):
Finalize nur impementieren wenn deine Klasse direkt unmanaged Resources hält.
wenn diese bereits in einem Wrapper vorhanden sind, sollte der Wrapper im Finalize bereits alles nötige erledigen.
In diesem Fall nur bei disposing = true, das Dispose des Wrappers aufrufen.