Allokation im Speicher von weitergegebenen Variablen

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

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    Neu

    Haudruferzappeltnoch schrieb:

    Nagut mit Klassenvariable dispose ich dann nur noch am Ende.
    Wenn das eine Form oder ein UserControl ist, pack das Dispose in die FormX.Dispose(bool disp) in der FormX.Designer.vb.
    Wenn nicht, lass die Klasse IDisposable implementieren, wo Du Deine Variabnle dann disposen kannst.
    usw.
    Das Dispose der letzten Klasse sollte dann in der FormX.Dispose(..) passieren.
    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!

    Neu

    petaod schrieb:

    Ich verstehe nicht, warum du unbedingt von Hand disposen willst.
    Da haben sich die Compilerentwickler sehr viele Gedanken gemacht, damit das automatisch geht.
    Das ist nicht richtig.
    Disposen geht nicht automatisch, und muss immer von Hand gemacht werden.

    Mir scheint, du verwechselst Disposen mit der Garbage-Collection, oder mit dem Finalizer.
    Weil auf den GC trifft zu was du sagst: der gibt automatisch SystemResourcen frei, die nicht mehr gebraucht werden.
    Und zwar äusserst effizient - und da soll man nichts von Hand machen.

    Aber es gibt SystemResourcen, die kann der GC nicht abräumen.
    Und für genau diese Dinge (und alle Klassen, die diese Dinge benutzen) ist der Dispose-Pattern und die IDisposable - Schnittstelle, und auch das Using-Schlüsselwort erfunden worden: Damit der Programmierer selbst bestimmt ("von Hand" also), wann genau ein Objekt nicht mehr gebraucht wird und aufgeräumt wird.

    Neu

    ErfinderDesRades schrieb:

    Disposen geht nicht automatisch, und muss immer von Hand gemacht werden.
    Ein managed object wird automatisch disposed, sobald es out-of-scope geht.
    Es gibt ja genügend Klassen, die IDisposable gar nicht implementiert haben.
    Deren Instanzen kannst du gar nicht manuell disposen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    tja, du liegst falsch.
    Such dir Buch oder gute Info im Internet (CodeProject-Artikel, MS-Doku) und bring dich auffn Stand.

    Du kannst auch ein Experiment machen: Öffne einen Filestream, lies zwei Zeichen aus, und lass ihn aus dem Scope gehen.
    Dann versuch dieselbe Datei mit Notepad zu öffnen, zu ändern, zu speichern. Wenn ich mich recht erinnere kriegst du dabei die Info, dass die Datei gesperrt ist.

    Die wird erst wieder frei, wenn du dein Programm schließt.

    Neu

    petaod schrieb:


    Ein managed object wird automatisch disposed, sobald es out-of-scope geht.
    Es gibt ja genügend Klassen, die IDisposable gar nicht implementiert haben.
    Deren Instanzen kannst du gar nicht manuell disposen.


    Mal am Beispiel von docs.microsoft.com/de-de/dotne…o.filestream?view=net-6.0
    MS schreibt:
    Dieser Typ implementiert die IDisposable-Schnittstelle.
    Nach Abschluss der Verwendung sollten Sie den Typ entweder direkt oder
    indirekt löschen. Zum direkten Löschen des Typs rufen Sie seine Dispose-Methode in einem try/catch-Block auf. Zum indirekten Löschen verwenden Sie ein Sprachkonstrukt wie using (in C#) oder Using
    (in Visual Basic). Weitere Informationen finden Sie im Abschnitt
    „Verwenden eines Objekts, das IDisposable implementiert“ des Themas „Die
    IDisposable-Schnittstelle“.


    Umn Missverständnisse auszuschliessen, würde ich nicht "von Hand gemacht" schreiben / verwenden.
    Benutze ich das Schlüsselwort USING nicht, nützt mir die Impelementierung der IDisposable Schnittstelle auch nichts, wenn ich vergesse zu Disposen.
    Das ist, was @ErfinderDesRades meint, behaupte ich mal frech.
    Das Using-Schlüsselwort als indirekte Verwendung des Disposen zu bezeichnen finde ich da genauer. Ich "mach" es ja eben nicht von Hand, streng genommen.

    Neu

    Dksksm schrieb:

    Ich "mach" es ja eben nicht von Hand, streng genommen.
    Das geht halt so:
    Allokation im Speicher von weitergegebenen Variablen
    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!