Laden...

VB.NET / Dispose Muster (nicht nur) bei SharpDX

Erstellt von Astrix vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.903 Views
A
Astrix Themenstarter:in
12 Beiträge seit 2012
vor 11 Jahren
VB.NET / Dispose Muster (nicht nur) bei SharpDX

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

49.485 Beiträge seit 2005
vor 11 Jahren

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

C
258 Beiträge seit 2011
vor 11 Jahren

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.