IDisposable implementieren und richtig nutzen

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von mwk.

    IDisposable implementieren und richtig nutzen

    Hey,

    Ich würde gerne von euch wissen, ob ich die Implementierung von IDisposable hier richtig angestellt habe, da ich noch nicht wirklich damit gearbeitet habe.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Net.Sockets
    3. Public Class Player
    4. Implements IDisposable
    5. Public _PlayerStreamWriter As StreamWriter
    6. Public _PlayerStreamReader As StreamReader
    7. Public _PlayerClient As New TcpClient
    8. Public Sub New(ByVal PlayerClient As TcpClient)
    9. _PlayerClient = PlayerClient
    10. _PlayerStreamReader = New StreamReader(PlayerClient.GetStream)
    11. _PlayerStreamWriter = New StreamWriter(PlayerClient.GetStream)
    12. End Sub
    13. #Region "IDisposable Support"
    14. Private disposedValue As Boolean
    15. Protected Overridable Sub Dispose(disposing As Boolean)
    16. If Not Me.disposedValue Then
    17. If disposing Then
    18. ' TODO: Verwalteten Zustand löschen (verwaltete Objekte).
    19. If (Not (_PlayerClient) Is Nothing) OrElse (Not (_PlayerStreamReader) Is Nothing) OrElse (Not (_PlayerStreamWriter) Is Nothing) Then
    20. _PlayerClient.Close()
    21. _PlayerStreamReader.Dispose()
    22. _PlayerStreamWriter.Dispose()
    23. End If
    24. End If
    25. _PlayerClient = Nothing
    26. _PlayerStreamReader = Nothing
    27. _PlayerStreamWriter = Nothing
    28. disposedValue = True
    29. End If
    30. Me.disposedValue = True
    31. End Sub
    32. Public Sub Dispose() Implements IDisposable.Dispose
    33. Dispose(True)
    34. GC.SuppressFinalize(Me)
    35. End Sub
    36. #End Region
    37. End Class


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Habe nicht nachgeschaut was drinnen steht aber die Implementierung an sich ist richtig. Nur solltest du Finalize überschreiben und von dort aus Dispose(False) aufrufen. Finalize müsste in VB der Ersatz für den Destruktor sein.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Achso die Sub habe ich völlig übersehen, da sie kommentiert war.

    VB.NET-Quellcode

    1. ' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt.
    2. Protected Overrides Sub Finalize()
    3. ' ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein.
    4. Dispose(False)
    5. MyBase.Finalize()
    6. End Sub

    So soll ich ihn stehen lassen ? Wenn man sich an die Kommentare hält, dann müsste ich die doch theoretisch nicht auskommentieren, da ich doch oben den Säuberungscode eingefügt habe. Falls ich mich da irgendwie irre, dann bitte sofort korrigieren, da ich mich wie gesagt damit noch nicht beschäftigt habe.
    StreamReader und Co kannst Du auch in einem Using-Block verwenden, da werden sie automatisch dispopsed.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,
    ich möchte drei Fragen anschliessen und hoffe sehr, dass sie hier geholfen werden.

    Dieses Beispiel ist von Stackoverflow. Ich stör mich nicht am "Overloads", aber am "connVSC2000" im zeiten IF Block, demnach wäre es eine unmaneged resource, obwohl vorher eine managed resource?

    Quellcode

    1. Protected Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
    2. If Not _disposed Then
    3. 'If _connVSC2000.State = ConnectionState.Open Then _connVSC2000.Close()
    4. If disposing Then
    5. _connVSC2000.Dispose()
    6. End If
    7. End If
    8. _disposed = True
    9. End Sub

    Es ist leider so, dass nahezu alle Beispiele die ich bisher finden konnte, zwar so oder ähnlich aussehen aber meist werden dann nur IF Blocks beschrieben (Beschreibungen die keiner braucht).
    Keine Beschreibung, kein Verweis auf den Unterschied zwischen managed und unmanged resource.

    Mein zweite Frage wäre,
    Warum die Finalize Methode overrides und nicht overridable heisst(so wie sonst auch in einer Basis)?

    Und die Dritte
    "Mybase.Finalize" wird beschrieben als die Methode die letztlich Serverresourcen freigibt.
    Die "Protected Overrides Sub Finalize" ist aber immer so implementiert, dass es keinen Aufruf an sie gibt, ausser vom GarbageCollector, nur wird der ausgebremst von "GC.SuppressFinalize(Me)", was auch sein muss.

    Gibt es Erklärungen dafür oder muss man es hinnehmen?
    Gruss Monika