Unlösbare Compiler-Warnung betreffend IDisposable

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Duster.

    Unlösbare Compiler-Warnung betreffend IDisposable

    Hallo Leute,

    ich programmiere erade an einem kleinen WinForms GDI+ Programm das ein interaktives GDI+ Tutorial werden soll.
    Lief
    alles eigentlich ganz, bis vor 2 Tagen. Ich bekam nachdem ich das
    Interface IDisposable in die Basisklasse Shape eingebaut hatte für alle
    Klassen die von Shape erben folgende Compiler Warnung:

    Warnung CA2213
    "Form1" enthält das Feld "_line", das den IDisposable-Typ
    "SingleLine" aufweist, aber nie verworfen wird. Ändern Sie die
    Dispose-Methode in "Form1", um "Close" oder "Dispose" für dieses Feld
    aufzurufen.

    Shape implementiert IDisposable und "SingleLine" ist die Klasse die von Shape erbt.

    Ich
    schaffe es einfach nicht diese Warnung loszuwerden. Habe ich
    IDisposable falsch implementiert. Ich hab schon zig Beispiele gefunden
    und alles mögliche ausprobiert (using... etc). Gegen Ende auch einfach
    heuristrisch aber nichts klappt

    Ich
    halte es aber für wichtig diese auf diese Warnung zu reagieren und sie
    nicht zu unterdrücken, da sonst der Speicher vielleicht vollaufen
    könnte!
    Wenn es gewünscht wird und weiterhilft poste ich auch den ganzen Source des kleinen Projekts und nicht nur Auszüge.

    Vielen Dank für Eure Mühe und Hilfe vorab!

    Shape:

    VB.NET-Quellcode

    1. Imports PensBrushesAndShapes.DataTypes
    2. Namespace ShapeTypes.BASE
    3. Friend Class Shape
    4. Implements IDisposable
    5. #Region "Shape Private Variables"
    6. Friend MyPen As Pen
    7. Private ReadOnly _penData as PenData
    8. #End Region
    9. #Region "Shape Constructors"
    10. Public Sub New()
    11. End Sub
    12. Public Sub New(penData As PenData)
    13. _penData = penData
    14. MyPen = GeneratePen(_penData)
    15. End Sub
    16. #End Region
    17. #Region "Shape Functions"
    18. Public Sub Dispose() Implements IDisposable.Dispose
    19. MyPen?.Dispose()
    20. End Sub
    21. Friend Function GeneratePen(penData As PenData) As Pen
    22. MyPen = New Pen(Color.FromArgb(penData.Alpha,
    23. penData.Red,
    24. penData.Green,
    25. penData.Blue), penData.Width)
    26. Return MyPen
    27. End Function
    28. #End Region
    29. End Class
    30. End NameSpace


    Klasse SingleLine:

    VB.NET-Quellcode

    1. Imports PensBrushesAndShapes.DataTypes
    2. Imports PensBrushesAndShapes.ShapeTypes.BASE
    3. Namespace ShapeTypes.Lines
    4. Friend Class SingleLine
    5. Inherits Shape
    6. #Region "CLASS SINGLELINE"
    7. #Region "SingleLine Private Variables"
    8. Private ReadOnly _e As PaintEventArgs
    9. Private ReadOnly _penData As PenData
    10. Private ReadOnly _coordinates As Point()
    11. #End Region
    12. #Region "SingleLine Properties"
    13. 'Shape.ShapeName = "SingleLine"
    14. #End Region
    15. #Region "SingleLine Constructors"
    16. Public Sub New()
    17. End Sub
    18. Public Sub New(e As PaintEventArgs, penData As PenData, coordinates As Point())
    19. _e = e
    20. _penData = penData
    21. _coordinates = coordinates
    22. DrawSingleLine(_e, _penData, _coordinates)
    23. End Sub
    24. #End Region
    25. #Region "SingleLine Functions"
    26. Private Function DrawSingleLine(e As PaintEventArgs, penData As PenData, coords As Point()) As PaintEventArgs
    27. Dim linePen As Pen
    28. linePen = GeneratePen (penData)
    29. linePen.DashStyle = penData.DashStyle
    30. linePen.StartCap = penData.StartCap
    31. linePen.EndCap = penData.EndCap
    32. e.Graphics.DrawLine(linePen, coords(0), coords(1))
    33. linePen.Dispose()
    34. Return e
    35. End Function
    36. #End Region
    37. #End Region
    38. End Class
    39. End Namespace


    Aufruf:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    2. MyBase.OnPaint(e)
    3. _cmdDrawState = True
    4. Dim typ as String
    5. typ = _penData.ShapeName
    6. Protected Overrides Sub OnPaint(e As PaintEventArgs)
    7. MyBase.OnPaint(e)
    8. _cmdDrawState = True
    9. Dim typ as String
    10. typ = _penData.ShapeName
    11. Select Case typ
    12. Case "SingleLine"
    13. _line = New SingleLine(e, _linePenData, _lineCoords)
    14. _line.Dispose()
    15. End Select
    16. End Sub


    Verzweifelt,
    Duster
    Soweit ich sehe, braucht deine Shape-Klasse IDisposable nicht zu implementieren (ist eh höchst fragwürdig umgesetzt).
    Schmeiss das MyPen-Feld raus aus der Shape-Klasse und lösch alles was inne Shape-Klasse mit IDisposable zu tun hat.

    Weil soweit ich sehe, wird MyPen ausserhalb von Shape nirgends benutzt.

    Merke: Weniger Code ist besserer Code.
    @Duster Jede Form hat in der Datei FormX.Designer.vb bereits die Prozedur:

    VB.NET-Quellcode

    1. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    2. <System.Diagnostics.DebuggerNonUserCode()> _
    3. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    4. Try
    5. If disposing Then
    6. If components IsNot Nothing Then
    7. components.Dispose()
    8. End If
    9. _line.Dispose() ' ### hier
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    Dort drinnen kannst Du Deine Objekte disposen.
    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!
    Ich würd mich dem Problem zwar gern annehmen, aber ich krieg nen Vogel, wenn immer nur die Hälfte zur Verfügung gestellt wird und man so das Problem daheim nicht nachstellen kann. Der Aufruf-Codeblock ist mit den Zeilen#1-#7 doppelt und somit eh schon nicht lauffähig. Und mit den ganzen Unbekannten lädt das Ganze nicht gerade zur Mithilfe ein. Sorry.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @'RodFromGermany
    Super, vielen dank es funktioniert.
    Hab grad noch was entdeckt. Wenn ich im Konnstruktor von SingleLine "MyBase.Disbose" schreibe, funktioniert es auch.
    Aber wiso, ausserdem klingt es für mich ziemlich seltsam im Konstruktor eines Objektes dessen Basisklasse zu verwerfen????!!!!. 8o :thumbsup:

    @'VaporiZed
    Stimmt, ich war ein wenig unter Zeitdruck, sonst schick ich im Anhang immer ein funktionierendes Bespielprojekt das die Fragestellung repräsentiert. :S

    @'ErfinderDesRades
    Studio hat angemeckert dass IDisposable angewendet werden muss.
    Alle meine ShapeKlassen(_line, _lines, _rect, _rects, _bezier, _polygon etc.) erben von Shape und nutzen die für alle notwendige GeneratePen(), warum ist das fragwürdig umgesetzt? ?(

    Ich hab mal versucht das MyPen Feld rauszuwerfen und alles zu löschen was mit IDisposable zu tun hat bekomme aber ständig die Warnung dass ich IDisposable implementieren soll!

    Kannst Du etwas detaillierter beschreiben wie Du Shape aufbauen würdest?

    Viele Grüße und vielen Dank für Eure professionelle Hilfe,
    Duster

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Duster“ ()

    mit "MyPen rauswerfen" meinte ich: MyPen rauswerfen.
    Ich sagte nicht "GeneratePen rauswerfen"

    VB.NET-Quellcode

    1. Imports PensBrushesAndShapes.DataTypes
    2. Imports System.Drawing
    3. Namespace ShapeTypes.BASE
    4. Friend Class Shape
    5. #Region "Shape Private Variables"
    6. Private ReadOnly _penData As PenData
    7. #End Region
    8. #Region "Shape Constructors"
    9. Public Sub New()
    10. End Sub
    11. Public Sub New(penData As PenData)
    12. _penData = penData
    13. End Sub
    14. #End Region
    15. #Region "Shape Functions"
    16. Friend Function GeneratePen(penData As PenData) As Pen
    17. Return New Pen(Color.FromArgb(penData.Alpha,
    18. penData.Red,
    19. penData.Green,
    20. penData.Blue), penData.Width)
    21. End Function
    22. #End Region
    23. End Class
    24. End Namespace

    Duster schrieb:

    Wenn ich im Konnstruktor von SingleLine "MyBase.Disbose" schreibe
    Im Konstruktor :?:
    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!
    @Duster Was hat ein .Dispose() in einem Konstruktor zu suchen?
    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!
    Dann ist das keine Lösung, sondern ein Hack mit unbekannten Nebenwirkungen, die Dir möglicherweise erst später reingrätschen. Daher Stichwort RCA. Daher von meiner Seite aus zurück zu Post#4
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.