Dispose eigene Klasse, wie genau?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Dispose eigene Klasse, wie genau?

    Hallo zusammen,

    ich würde gerne wissen was ich genau tun muss wenn ich eine Instanz von meiner Klasse richtig beenden möchte. Diese enthält verschiedene Objekte u.a. auch ein Excel.Workbook. Dieses sollte ich beim Disposen ja auch schließen oder? Ich kann mit den Kommentaren aus dem VB Code nichts anfange, was ist mit verwaltete Objekten und nicht verwaltete Objekten gemeint? Was muss ich tun bei den TODO stellen? Das hat es mir ja alles automatisch eingefügt. Ich hab jetzt einfach mal alle Objekte auf Nothing gesetzt und die BindingSource disposed, stimmt das so? Fehlt noch was?


    VB.NET-Quellcode

    1. Public Class EQ_Document
    2. Implements IDisposable
    3. Private WithEvents m_EQBindingList As New EQ_BindingList(Of EQ_Component)
    4. Private WithEvents m_Binding As New System.Windows.Forms.BindingSource
    5. Private m_DataSheets As New EQ_DataSheetCollection
    6. Private m_DocSettings As New EQ_DocSettings
    7. Private m_EQwb As Excel.Workbook = Nothing
    8. Private m_FileName As String = String.Empty
    9. Public Sub New(ByVal doc_filename As String)
    10. m_Binding.DataSource = m_EQBindingList
    11. m_EQwb As Excel.Workbook = xlApp.Workbooks.Open(FullFilename, False, True)
    12. m_FileName = doc_filename
    13. End Sub
    14. .....'hier kommt der ganze andere code ....
    15. #Region "IDisposable Support"
    16. Private disposedValue As Boolean ' So ermitteln Sie überflüssige Aufrufe
    17. ' IDisposable
    18. Protected Overridable Sub Dispose(disposing As Boolean)
    19. If Not Me.disposedValue Then
    20. If disposing Then
    21. ' TODO: Verwalteten Zustand löschen (verwaltete Objekte).
    22. m_Binding.Dispose()
    23. End If
    24. m_EQBindingList = Nothing
    25. m_Binding = Nothing
    26. m_DataSheets = Nothing
    27. m_EQwb = Nothing
    28. m_DocSettings = Nothing
    29. ' TODO: Nicht verwaltete Ressourcen (nicht verwaltete Objekte) freigeben und Finalize() unten überschreiben.
    30. ' TODO: Große Felder auf NULL festlegen.
    31. End If
    32. Me.disposedValue = True
    33. End Sub
    34. ' TODO: Finalize() nur überschreiben, wenn Dispose(ByVal disposing As Boolean) oben über Code zum Freigeben von nicht verwalteten Ressourcen verfügt.
    35. 'Protected Overrides Sub Finalize()
    36. ' ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(ByVal disposing As Boolean) Bereinigungscode ein.
    37. ' Dispose(False)
    38. ' MyBase.Finalize()
    39. 'End Sub
    40. ' Dieser Code wird von Visual Basic hinzugefügt, um das Dispose-Muster richtig zu implementieren.
    41. Public Sub Dispose() Implements IDisposable.Dispose
    42. ' Ändern Sie diesen Code nicht. Fügen Sie oben in Dispose(disposing As Boolean) Bereinigungscode ein.
    43. Dispose(True)
    44. GC.SuppressFinalize(Me)
    45. End Sub
    46. #End Region
    47. End Class
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    VB.NET-Quellcode

    1. m_EQBindingList = Nothing
    in Dispose reinzuschreiben bringt null Punkte.
    Dort musst Du alle Objekte, die explizit zerstört werden müssen, explizit zerstören: m_EQBindingList.Dispose(), sofern diese disposable sind.
    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!
    Eine BindingList hat keine Dispose Methode, da frag ich mich, was passiert mit den Objekten in der BindingList? Sollte ich ein .Clear auf die Bindinglist machen? Oder muss ich sogar jedes Objekt in der BindingList disposen? hmhmhm
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    Oder muss ich sogar jedes Objekt in der BindingList disposen?
    Was ist denn da drinnen?
    Wenn es erforderlich wäre, hätte die List ein Dispose().
    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!
    Eine Klasse mit vielen Eigenschaften aber nur des Typs String, Integer und Boolean
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    String, Integer und Boolean
    muss nicht disposed werden.
    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!
    Wie schon gesagt, muss nicht disposed werden. Alternativ kannste aber auch alle Elemente durchgehen diese disposen und anschließend mit clear alles raus hauen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.