Klassen, Instanzen, Objektverweise

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Klassen, Instanzen, Objektverweise

    Hallo zusammen,

    ich bin neu hier und werde wohl in nächster Zeit, viele, komische Fragen stellen.
    Ich beschäftige mich gerade mit Klassen und wundere mich über die Instanzen. Was passiert mit einem Objektverweis, nachdem ich ihn benutzt habe?
    Eigentlich nichts, oder? Er ist dann da und bleibt da? ?(

    Ich meine, wenn ich eine Instanz in einer Prozedur erstelle, wie z.B. einer Button-Click-Prozedur, dann bleibt der Objektverweis bestehen, auch wenn die Prozedur beendet wurde?
    Wenn ich den Button jetzt nochmal klicke, wird ja der selbe Objektverweis wieder erstellt. Wird der erste dann gelöscht, da ja die Namen identisch sind?
    Wie wirkt sich das auf den Arbeitsspeicher aus?

    Analog dazu: In einer Klasse, mit mehreren Methoden, benötigt ein Bruchteil der Methoden einen bestimmten Objektverweis.
    Ist es nachteilhaft, wenn ich in den jeweiligen Methoden, jedes Mal den Verweis neu erstelle? Oder ist es besser, einen Verweis für die ganze Klasse zu machen, obwohl die meisten
    Methoden, diesen Verweis gar nicht bräuchten :/

    Hoffe, ich konnte meine Frage halbwegs sinnvoll darbringen :rolleyes:
    Da kommen bestimmt noch mehr solcher Fragen, auf die ich in keinem Buch eine Antwort finde...

    Viele Grüße
    Isa
    Zu aller erst, willkommen im Forum ^^

    Und als nächstes, willkommen in der Welt von .NET in der sich der sog. Garbage Collector (GC) darum kümmert die allermeisten Dinge die wir als Programmierer so anstellen hinterher aufzuräumen.
    Das gilt natürlich für die meisten Instanzen von Objekten die wir erstellen. Eine einfache Regel dazu ist, sofern auf ein Objekt keine Referenzen mehr bestehen, wird es vom GC auch aufgeräumt.

    Wenn du in einer Button-Click Prozedur ein Objekt erstellst, es aber nirgends sonst verwendest oder übergibst, dann wird es, nachdem die Prozedur beendet ist, vom GC enfternt.

    Was deine Frage angeht, zeig uns doch mal ein Beispiel, denn wie man mit Objekten umgeht, und wo man sie nacher speichert hängt auch davon ab was man damit anstellt.

    Natürlich kann man, sobald man etwas in zwei Methoden braucht, eine Klassenvariable erstellen. Man kann aber auch, wenn eine Methode die andere aufruft, das Objekt in der ersten erstellen, und dann via Parametern der zweiten übergeben.
    …was allerdings voraussetzt, dass dieses Objekt IDisposable implementiert, sonst wird das nix mit Using. Alternativ kann man sich natürlich nen Wrapper schreiben, der dann IDisposable implemeniert und in der entsprechenden Sub das unmanaged object manuell disposed.
    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.
    @Isabelle Ebenfalls: Willkommen im Forum. :thumbup:
    Wie das mit Dialogen und Using funktioniert, wird hier erläutert:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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 erneut,

    danke für die schnellen Antworten. :)
    Von diesem GC habe ich bereits gelesen. - Das 'using' schaue ich mir mal an.

    Die Frage war eher allgemeiner Natur, wie VB mit diesen Instanzen umgeht.
    Um beim Beispiel der Button-Click Prozedur zu bleiben:
    Ich erstelle bei Klick den Objektverweis "Dim irgendwas As Klassenname". Jetzt wird eine Instanz erzeugt.
    Also habe ich jetzt dieses Objekt. Wenn ich den Button jetzt erneut (oder mehrfach) anklicke, erstelle ich dann mehrere Objekte mit gleichem Namen, oder benutzt .NET wieder das schon erstellte Objekt?
    Oder wird das Bestehende gelöscht und ein Neues erzeugt? Kann es mehrere "irgendwas" von "Klassenname" geben?

    Als Projektbeispiel:
    Ich möchte 2 Schrittmotoren über den seriellen Port steuern. Auf der Hardware-Seite, wartet ein ESP32 auf Befehle.
    Dazu habe ich eine eigene Klasse, die alles erledigt, was die serielle Kommunikation anbetrifft. (ComPort)
    Auf meiner Form-Klasse, wird beim Laden, auf die ComPort Klasse verwiesen.
    Jetzt möchte ich noch eine weitere Klasse, die sich um die ganze Befehlsabarbeitung kümmern soll. Da stehen Methoden drin, die eigentlich nur rechnen sollen. Mit EINER Ausnahme:
    Vier Methoden sollen dort noch hinein, die sich um die manuelle Steuerung kümmern sollen. Also im Grunde für die 4 Buttons auf dem Hauptform, (up, down...) Befehle errechnen und das Ergebnis
    direkt von dort, an die ComPort Klasse schicken sollen.
    Dafür muss ich dann natürlich dort eine Instanz erzeugen. Die brennende Frage ist, ob ich den Objektverweis nun in jede der 4 Methoden schreiben soll, also bei jedem Button-Klick
    ein "Dim Com-Dingsda As New Klassenname" aufrufen soll (kann), oder ob es sinvoller ist, die Instanz direkt von vornhinein zu erstellen, obwohl ich sie zur Laufzeit vielleicht gar nicht benutze. :huh:

    Vermutlich mache ich mir auch nur zuviele Gedanken über unwichtige Sachen. Ich möchte halt versuchen, es so 'sauber' wie möglich zu programmieren. :rolleyes:
    Will ja schließlich noch Einiges über OOP lernen.

    Ich hoffe mein Gedankenwirrwar ist verständlich. :/
    Danke und Grüße
    Isa
    @Isabelle Genau das hat @EaranMaleasi geschrieben.
    Bei Verlassen der Button_Click()-Prozedur ist die besagte Instanz nicht mehr referenziert und wird vom Gabage-Collector weggeräumt.
    Beim nächsten Button_Click()-Aufruf wird eine neue Instanz derselben Klasse erstellt.
    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!

    Isabelle schrieb:

    komischen Fragen
    Es gibt keine komischen Fragen, es gibt manchmal komische Antworten. ;)
    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!