New-Operator, Was passiert mit der "alten" Instanz

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

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

    New-Operator, Was passiert mit der "alten" Instanz

    Hallo,

    was sind hier die konkreten Unterschiede. Wird bei New irgendwie eine "alte" Instanz erhalten bleiben?

    VB.NET-Quellcode

    1. Dim array1() as Integer
    2. array1 = New Integer {1,2,3}


    VB.NET-Quellcode

    1. Dim array1() as Integer
    2. array1 = {1,2,3}


    Ich sehe z.B. bei Datenbankverbindungen im Code generell Definitionen wie: xxx = New NpgsqlConnection(). Aber warum ist da ein New dabei bzw. was passiert ohne New?
    @Haudruferzappeltnoch

    Bei beiden Variante wird zuerst array1 bekanntgegeben (Deklaration).

    VB.NET-Quellcode

    1. Dim array1() as Integer


    Hier wird eine Neu-Instanzierung mit einer Initialisierung eingeleitet.

    VB.NET-Quellcode

    1. array1 = New Integer() {1,2,3}

    VB.NET-Quellcode

    1. array1 = {1,2,3}'Kurzversion



    EDIT: Nachtrag
    Bei Neu-Instanzierung einer Variable bleibt die Alt-Instanzierung weiterhin bestehen.

    Der "Garbage Collection" ist jedoch bemüht alte Instanzierungen zu erkennen. Besteht definitiv keine Referenz mehr zu einem Objekt, wird er vom Garbage Collection abgeräumt, d.h. der Speicher wird für die weitere Verwendung freigegeben.

    Leider gibt es Objekte die für den Garbage Collection nicht so leicht zu identifizieren sind. Solche Objekte können unter Umständen für ewig nicht vom Garbage Collection freigegeben werden. Der Garbage Collection setzt die Generation solcher Instanzen bzw. Objekte je nachdem soga auf die die höchste Generation, so das diese wirklich erst beim Beenden des Programmes freigegeben werden.

    Gerade in Kombinationen mit API's können Objekte die nicht korrekt zurückgesetzt (Dispose) wurden Speicherlecks (memory leaks) erzeugen.

    Ist eine Objekt-Variable auf Nothing gesetzt, gibt es für den Garbage Collection keinen Bedarf aktiv zu werden.

    Freundliche grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()

    Hallo

    Ich versuche es mal.

    Klassen werden mit dem New Schlüsselwort instanziiert.

    Also bekommt man mit New eine neue Instanz der Klasse.

    Vergleichen wir es mal mit einem Blatt Papier. du hast verschiedene Blätter. Karriert, Liniert oder farbig.
    Nimmst du ein neues Blatt von einem linierten Papier mit Rechnungskopf hast du deine Grundlage. (Die Klasse)
    Nun schreibst du ein paar Rechnungspositionen drauf. (Du verwendest das Papier) - Du verwendest diese Instanz der Klasse. Die anderen Blätter die du liegen hast bleiben ja unverändert.

    Nun nimmst du ein weiteres Blatt, hier willst du aber einen Plan zeichnen. Du nimmst ein kariertes. Also eine neues Blatt - eine neue Instanz.
    Hier zeichnest du einen Plan von einem Raum.

    Die andere Instanz (dein Blatt mit dem Rechnungskopf bleibt unverändert). Nimmst du nun ein neues Blatt Papier mit Rechnungskopf bleibt das alte unverändert und du arbeitest mit dem neuen.

    Dieser Ablauf nun als Pseudocode:

    VB.NET-Quellcode

    1. Dim rechnung1 As New Rechnungspapier()
    2. rechnung1.Positionen.Add("Arbeitszeit",135,20)
    3. rechnung1.Positionen.Add("Tinte",21,65)
    4. Dim plan1 As New Planpapier()
    5. plan1.Zeichne()
    6. Dim rechnung2 As New Rechnungspapier()
    7. rechnung2.Positionen.Add("Hilfestellung Honorar","842")


    Gehst du aber nun danach noch her und machst folgendes:

    VB.NET-Quellcode

    1. rechnung1 = New Rechnungspapier()


    Wird das Blatt Papier gelöscht und wieder auf den Zustand gesetzt wie es war bevor du die Positionen aufgeschrieben hast. Also ein Blatt mit Linien und einem Rechnungskopf. Weil du der Variablen eine neue Instanz der Klasse zugewiesen hast. Das Blatt (den Klassenzustand/die Instanz) wie es vorher war gibt es nicht mehr. Du hast also auf den Platz wo das Blatt lag, ein neues Blatt vom selben Typ gelegt und das bereits beschriebene in den Mülleimer geworfen.


    Ich hoffe das kann man halbwegs nachvollziehen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Ja das kann ich nachvollziehen, danke. Ich hätte aber noch eine spezielle Nachfrage.

    Wenn ich in einer anderen Klasse eine Variable verwenden will, dann kann ich die erste Klasse als Variable deklarieren sowohl mit als auch ohne New. Wie ich das da verstehen muss, ist mir noch nicht ganz klar. (Im Speziellen ist das jetzt eine Form bei mir, ich weiß nicht ob sich das zu anderen Klassen noch unterscheidet)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Friend test as String
    3. Private Sub testabc
    4. test = "abc"
    5. End Sub
    6. End Class
    7. Public Class Form2
    8. Private f As Form1 (<---- hier bzw.) Private f as New Form1
    9. Private Sub testchange
    10. If f.test ="abc" Then f.test="bcd" End If
    11. End Sub
    12. End Class


    Inwiefern hier das New wichtig ist kann ich noch nicht daraus ableiten
    Das ist etwas (leider) auch nur in VB geht und Mist ist. Der Kompiler würde hier automatisch quasi ein New vorsetzen.
    Also gilt wieder das selbe Prinzip.
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Mist geht auch nur bei Forms.
    Bei allen anderen Klassen verhält sich die Sprache vernünftig: Ein Objekt, was nicht (mit New) erzeugt wurde ist nichts - Nothing.
    Und von Nothing kann man keinerlei Property abrufen.
    Aber wie gesagt bei Forms geht das trotzdem, und das erschwert Anfängern, ja sogar ziemlich fortgeschrittenen AutoDidakten, den Unterschied zwischen einem Datentyp und einem Objekt (des Datentyps) zu verstehen und erkennen.
    Grauenhaft. Ich fühle mit dir, meine Augen tun gerade auch weh.
    Warum das MS so belassen hat verstehe ich bis heute nicht. :cursing:
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    "Natürlich" funktioniert das. Wenn keine Instanz da ist, wird eine erstellt. Ist auch dokumentiert, hier nochmal nachzulesen. Dass es eine syntaktisch-programmierlogische Frechheit ist, will ich damit aber nicht infrage stellen.
    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.
    Furchtbar gruselig diese Thema mit der „automatischen instanzierung von Forms“…

    Als ich von C# zu VB.Net gewechselt bin bzw. damit angefangen habe, bin ich aus allen Wolken gefallen welch schmu man alles treiben kann, bis ich Option Strict on gefunden habe.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Das ist eine der wenigen Sachen, die ich nicht mal zu meinen Anfangszeiten falsch gemacht habe.
    Als ich mit Vb.Net angefangen habe, wusste ich schon was eine Instanz ist.

    Ich finde Microsoft sollte das unbedingt ändern, denn es gibt keinen Vorteil und schon gar keine Anwendung die so etwas rechtfertigen würde.

    Option Strict On und Option Explizit On sind sowieso in Vb.Net bei mir ständige Begleiter.
    Ich schreibe die quasi in jeder Vb.Sheet bewusst immer zuoberst nochmals hin.

    Freundliche Grüsse

    exc-jdbi
    Okay, ich steh nochmal auf dem Schlauch ich dachte ich hätte es verstanden, aber habe ich doch nicht.

    VB.NET-Quellcode

    1. '-------1
    2. Dim test as DataTable
    3. test.Rows(0).Item(0) = 1
    4. '-------2
    5. Dim test as New DataTable
    6. test.Rows(0).Item(0) = 1


    Verstehe ich das so richtig?
    Bei 1 ändere ich den ersten Eintrag für test als Klasse und daher haben alle danach erzeugten Instanzen schon diesen Eintrag
    Bei 2 ist test die Instanz und ich ändere den ersten Eintrag in dieser Instanz
    Zeile#3 scheitert, weil test zwar vom Typ DataTable ist, aber keine Instanz. Es dürfte also eine NullReferenceException bei dem Versuch kommen. Du kannst test als Klasse (also effektiv die DataTable-Klasse) so nicht ändern. Du versuchst dort einen Bauplan zu manipulieren. In einem Bauplan eines Hauses lässt es sich schlecht wohnen. Oder anders: Einen Tisch in einem Zimmer zu platzieren, welches nur auf dem Plan existiert, ist nicht von Erfolg gekrönt.
    Zusammenfassend: Annahme 1 baut auf einer Grundvermutung auf, die von Anfang an nicht zutrifft.

    Du kannst test auf diesem Weg nicht so manipulieren, dass alle danach erstellten Instanzen bestimmte Eigenschaften dadurch aufweisen. Denn test ist ja keine Klasse, sondern eine Variable von einem bestimmten Klassentyp. Sowas kann man im Konstruktor der Klasse (in dem Fall also DataTable) machen, da jede Instanz diesen zu Beginn aufruft. Aber effektiv wird somit immer nur jede einzelne, konkrete Instanz manipuliert, nicht alle, die dann folgen.
    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.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Du hast was gemacht, bei dem was anderes passiert als Du denkst. Wenn Du "eine DataTable auf's Form ins DGV ziehst", wird keine DataTable erzeugt, sondern eine BindingSource. Diese verknüpft die tDS-DataTable mit Deinem DGV. Es wird also eine BindingSource-Instanz erzeugt und modifiziert, damit die DataTable-Inhalte im DGV angezeigt und dort auch manipuliert werden können. Die DataTable selber exisiert innerhalb der tDS-Instanz, die notfalls ebenfalls instanziiert auf's Form gelegt wird, zu sehen unten bei den Komponenten. Da dürfte dann also ein tDS-Symbol und eine BindingSource dazugekommen sein. Und vielleicht noch ein BindingNavigator.
    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.
    In Zeile 2 sagt du, dass du eine DataTable mit dem Namen "test" definierst. Also das ist die Instanz der Tabelle.
    In Zeile 5 machst du die Tabelle "test" mit einer neuen Instanz einer Tabelle matsch.

    Wenn du Daten zufügen willst, könntest du erst eine Instanz einer DataRow definieren und diese Row dann per test.AddRow der Tabelle übergeben.

    Nachtrag: Wann will man denn eine neue Instanz einer Tabelle haben? Eigentlich nur einmal, beim ersten Anlegen, dannach befülle ich die Instanz eines ganzen DataSets aus einer XML, die ich zuvor beim letzten Programmlauf gesichert habe. Ich will sicher aber Instanzen neuer Details haben, also DatatableRow, besser typisiert: "KundenRow", "BestellungenRow", um diese dann an die Tabelle anzuhängen in die es eh schon gehört. Deswegen sind es ja auch eben nicht einfach DatatableRow's (oder DataRow's) hab es grad nicht im Kopf. Weil die dinger sind nicht stark typisiert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dksksm“ ()

    Ja ums erste mal instanzieren geht es auch.

    @VaporiZed Ja genauso ist es wie du sagst. Ich hab eine BindingSource und das DataSet drauf.
    Also die Dinger auf der Form sind bereits instanziert, ok

    Heißt das wenn von der tDS bereits eine Instanz existiert wird die nicht aufs Form gezogen?
    Oder bekomme ich da eine neue und kann die erstellt da nicht mehr draufkriegen?
    Die BindingSource bindet auch auf die Instanz nicht auf die Klasse oder?
    Der Form-Designer ist ein Tool zur "visuellen Programmierung".
    Was du da machst an Draggen und Droppen das übersetzt er im Hintergrund in handfesten vb.net-Code.
    Den Code schreibt er in die Form.Designer.vb - Datei.
    Jedes Form im Solution-Explorer hat eine .Designer.vb - Datei - die ist nur defaultmässig verborgen. Man kann oben im SolutionExplorer "alle Dateien anzeigen" klicksen, dann werden die .Designer.vb-Files sichtbar.
    Also nicht sofort, aber dann erhält das Form-Symbol son '+', und wenn man da draufklickst, erweitert sich der Treenode und man kann die .Designer.vb sehen.
    Mach das mal, und guck dir die .Designer.vb auch mal an. Da ist in Code aufgeschrieben, was du im Form-Designer gebastelt hast.

    Bastel mal ein leeres Form, und öffne die .Designer.vb.
    Dann zieh im Form-Designer ein Element aus dem Datenfenster aufs Form, wodurch ja DGV, BindingSources, BindingNavigator erzeugt werden.
    Nun guck dir an, wie diese Dinge im .Desinger-Code sich niederschlagen.
    (Unter anderem findest du da auch die ganzen Instanzierungen mit New)

    Haudruferzappeltnoch schrieb:

    Heißt das wenn von der tDS bereits eine Instanz existiert wird die nicht aufs Form gezogen?
    Oder bekomme ich da eine neue und kann die erstellt da nicht mehr draufkriegen?
    Die BindingSource bindet auch auf die Instanz nicht auf die Klasse oder?


    Haudruferzappeltnoch schrieb:

    Heißt das wenn von der tDS bereits eine Instanz existiert wird die nicht aufs Form gezogen?
    Was meinst du mit "von der tDS bereits eine Instanz existiert" - wo soll die existieren?
    Also wenn du ein leeres Form hast, und du siehst kein tds darauf, dann "existiert" es wohl nicht.
    Wenn du nun wie gesagt aus dem Datenfenster zB ein Table-Icon aufs Form ziehst, dann generiert der FormDesigner allerlei Dinge aufs Form, u.a. auch ein tds - siehste ja (deswegen heisst es "visuelle Programmierung". (Und deswegen heisst es: Visual Studio"))
    Wenn du nun ein zweites Tabellen-Icon aus dem Datenfenster auf dasselbe Form ziehst, dann generiert der FormDesigner wieder allerlei Dinge, aber ein zweites tds nicht. Deswegen siehste auch kein zweites.
    Der Form-Designer ist eben so schlau, dass er weiss: Ein tds pro Form genügt im Allgemeinen.

    Das ist jetzt kein Sprach-Feature im engeren Sinne, sondern wie gesagt: Der Form-Designer ist ein Programmier-Tool, was Code generiert. Man hätte dieses Tool auch anders programmieren können, aber so, wie er nun funktioniert, funktioniert er im Allgemeinen ganz ausgezeichnet.
    Meine vier Views-Videos kennste?
    Da wird ja sehr viel mittm Form-Designer gearbeitet. Und (Film 1) mittm Dataset-Designer auch - das ist auch so ein Tool, und das generiert auch eine .Designer.vb-Datei - guck dir das unbedingt an.

    Haudruferzappeltnoch schrieb:


    Oder bekomme ich da eine neue und kann die erstellt da nicht mehr draufkriegen?
    Den Satz verstehe ich jetzt auch mit gutem Willen nicht. Wo bekommst du eine neue von was und kannst die erstellt da (wo?) nicht mehr draufkriegen - hä??


    Haudruferzappeltnoch schrieb:

    Die BindingSource bindet auch auf die Instanz nicht auf die Klasse oder?
    Ja.
    Nochmal: Eine Klasse ist ein Datentyp - genauer: ist die Definition eines Datentyps. Mit einem Datentyp kannst du nichts tun - gar nichts.
    Man kann Objekte (alias "Instanzen") eines Datentyps erstellen (mit New - schau in den Designer-Code!). Ja, an so Objekte kann eine BindingSource binden.
    Aber das wusstest du doch schon?

    (Es gibt übrigens eine Ausnahme, dass sind die Shared Member einer Klasse. Aber das ist ein anderes Kapitel in dem Buch von Löffelmann, was du ja sicherlich fleissig am lesen bist)
    Die vier Views Videos hab ich gesehen, aber die Code-Anbindung der DataSets war da glaub ich nicht zu sehen. Aber in den Designer-Code werd ich schauen, da werden wahrscheinlich die Fäden zusammen laufen.

    Die andere Frage bezieht sich darauf, was passiert wenn ich z.B. einen Teil des Designer-Codes schreibe, weil ich z.B. selbst das tDS instanziere, wird das dann auf dem Form angezeigt?
    Wahrscheinlich gehört da mehr zu und ich sehe das dann auch im Designer-Code

    Ich hab da ein anderes Buch (vielleicht ist es sogar der Löffelmann, ich muss morgen nochmal auf den Namen schauen, der Vorname von dem Autor ist auf jeden Fall Klaus xD), da bin ich mit Instanzen aber viel weniger durchgestiegen als hier, da fehlen mir wohl die Anwendungsbeispiele

    Vielen Dank