Objekt ohne New ?

  • VB.NET

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

    Objekt ohne New ?

    Hi Leute,

    heute habe ich mal eine Verständnisfrage!

    Undzwar sagt man ja, dass in .NET alles ein Objekt ist. Gut soweit! Es sind ja auch alle Datentypen Typ Object abgeleitet soweit ich weiß.
    Dann ist ja auch ein primitiver Datentyp wie ein String doch eigentlich kein primitiver Datentyp mehr !?! Oder?

    Immerhin stellt ein String ja auch Klassenmethoden zur Verfügung!

    Bis hierhin alles kein Problem! ABER

    Warum muss ich einen String nicht mit New instanziieren?

    Das verwirrt mich ein wenig, weil der ein String ja auch nichts anderes ist als ein Objekt. Wo besteht denn der Unterschied zwischen eine Objekt welches mit New instanziiert werden muss und einem, bei dem das nicht nötig ist???

    Gruß Mechatron :)
    Hmm?
    Du kannst doch auch ein Objekt ohne "New" machen..
    Dim test As String
    oder
    Dim test As Object, brauchste also nicht immer

    Nur wenn du Steuerlemente hinzufügen willst ( z.B. Benutzersteuerelemente ) dann musst du das mit New Deklarieren, da es ja eine "Neue" Form ist.
    Sobald du etwas mit "New" Deklariert hast, kannst du auch auf die Steuerlemente auf dem Steuerelement zugreifen ( Bsp.: Du willst auf die TextBox auf
    Benutzersteuerelement x zugreifen:

    Dim test As New X
    test.TextBox1.Irgendetwas

    Ohne New geht das nicht.

    Hoffe ich konnte dir das gut beschreiben.

    AliveDevil
    Du kannst auch eigne Klassen ohne New benutzen. Das New ist nur notwendig wenn du ein KlassenObjekt verwendest indem du z.B. etwas zuordnest. Nutzt du lediglich Funktionen einer Klasse kannst du sie einfach als Shared deklarieren und somit bedarf es keiner Instanzierung

    VB.NET-Quellcode

    1. Public Class MeineKlasse
    2. Public Shared Function TueDies(ByVal value As Integer) As String
    3. Return (value + 1).ToString()
    4. End Function
    5. End Class


    Verwenden

    VB.NET-Quellcode

    1. TextBox1.Text = MeineKlasse.TueDies(45)
    Um beim String-öBeispiel zu bleiben...
    Ist die Substring Methode als eine als Shared deklarierte Funktion der Klasse String?

    Und es ist doch richtig, dass in .net ein String kein primitiver Datentyp im herkömmlichen Sinne mehr ist oder?
    Die Basisdatentypen sind doch die, die einst die primitiven Datentypen waren

    Also String, Integer, Long usw.

    Die Datentypen, die zumindest früher kein Objekt repräsentierten.

    _________________________________________________________

    Aha!
    ICh glaub jetzt hab ichs.
    Falsch ist:

    AliveDevil schrieb:

    Hmm?
    Du kannst doch auch ein Objekt ohne "New" machen..
    Dim test As String
    oder
    Dim test As Object, brauchste also nicht immer

    Damit erstellt man nur eine Variable, die ein Objekt dieses Typs "aufnehmen" kann.

    Richtig ist:
    Eigentlich sind auch String, Integer etc. Objekte. Als fest eingebaute Datentypen verhalten sie sich aber anders, z.B. wäre da zu nennen:
    • Konstruktor: Diese Datentypen lassen sich direkt instanzieren (Dim i As Integer = 1) oder werden direkt instanziert, wenn man keinen Wert angibt (Strings leer, Integer mit 0, ...). Man kann aber auch einen Konstruktor verwenden, wenn man will.
    • Objektstatus: Solange diese Datentypen nicht geboxed werden, verhalten sie sich nicht so, als wären sie Objekte. In Java z.B. sind Strings tatsächlich Objekte, die man nicht mit = (bzw. in Java ==) vergleichen kann, sondern nur mit equals().
    Kleine Ergänzung:
    Strings ohne Wertzuweisung sind auf Klassenebene nicht leer (= "" = String.Empty), sondern Nothing!
    Integer und dergleichen sind ja Strukturen und haben deshalb Wertesemantik, String ist eine immutable Klasse, also eine, die Wertesemantik vortäuscht. Deshalb ist der Stringstandardwert auf Klassenebene auch Nothing.
    Innerhalb von Methoden haben alle Variablen ohne Zuweisung gar keinen Wert, da ist es also egal.

    Viele Grüße, Phil.
    Die Antwort von Renati hat mich verständnismäßig ein wenig voran gebracht!

    Ich erzähle mal, wie ich überhaupt auf die Frage gekommen bin:

    Zum einen heißt es ja, dass in .NET alles ein Objekt ist. Zum anderen hab ich mich aber auch gefragt, warum ich z.B. bei einem String ohne neues String Objekt, auf Methoden und Funktionen der Stringklasse zugreifen kann. (z.B. Substring)

    Ich habe vor Jahren mal mit den Grundlagen von Java begonnen (danach war aber lange nichts :-P). Da gab es das Static-Schlüsselwort. Das erlaubte ja auch eine Klasse zu verwenden, ohne die Klasse vorher instanziieren zu müssen.

    Ist wahrscheinlich das selbe in vb?
    Jau, nur sind in VB statische Klassen Module. Statische Methoden hingegen schimpfen sich Shared. Ist historisch bedingt, dass es so heißt. Theoretisch könntest Du auch eine Not Inheritable-Klasse mit privatem Konstruktor und ausschließlich Shared-Variablen und -Methoden machen. Das ist dann aber dasselbe wie ein Modul.

    Hier ist was schönes, um die Variablenproblematik zu erklären.

    Gruß FatFire
    Den Artikel fand ich sehr aussagekräftig!

    Jetzt bin ich bloß an dem letzten Absatz hängen geblieben!

    Was ist der Stack?

    Und: Das ließt sich, als wenn Werte-Typen nicht vom GC bereinigt werden! Ich fand an .NET ja gerade gut, dass ich mich um die Speicherbereinigung nicht kümmern muss. War wohl falsch gedacht :-p

    Mechatron schrieb:

    Ich fand an .NET ja gerade gut, dass ich mich um die Speicherbereinigung nicht kümmern muss. War wohl falsch gedacht :-p

    Das hat mit dem Stack nix zu tun. In C musst du dich auch nicht um Sachen kümmern, die auf dem Stack liegen, nur wenn du "Speicher" verwendest (wie in VB zb für referenztypen), musst du in C "aufräumen" und bei managed .Net halt nicht.