Nothing = 0 ?

  • VB.NET

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

    Nothing = 0 ?

    Hi,

    ich weise einem Integer den Wert Nothing zu, was ja NULL entspricht oder? Wenn ich jetzt Abfrage ob Variable = Nothing wird sowohl bei Nothing als auch bei 0 der Wert True zurückgegeben.
    Alle anderen Werte ungleich 0 geben False zurück.
    Aber eigentlich sollte Nothing doch eben nicht gleich 0 sein oder?
    Option strict = on

    If it's stupid and it works it ain't stupid.

    VB.NET-Quellcode

    1. Dim a As Integer?
    2. Dim b As Integer
    3. a = Nothing
    4. b = Nothing


    Schau mal im Debug an!

    Und msdn dazu:
    msdn.microsoft.com/library/ms235245(v=vs.110).aspx
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    unter C# meckert mir VS schon vor dem Kompilieren... was aber unter VB selbst mit Option Strict On nicht der Fall zu sein scheint.

    Edit:
    Okay nun ist klar wieso. Siehe Erklärungen von @MemoAnMichSelbst und @ErfinderDesRades

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

    VB unterscheidet Integer und Integer?
    Das ist so gewollt.
    Integer = Nothing setzt den Wert auf Default (genauso Boolean)
    Integer? = Nothing setzt auch auf Nothing (genauso Boolean?)
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Thx, ich wusste nicht, dass in VB eine Variable standartmäßig nicht NULL sein kann.

    Nur so aus Neugier, weiß jemand wieso das bei VB so ist? Ich finde es logisch, dass eine Variable keinen Wert hat solange man ihr keinen zuweist. Warum sollte ein Integer per default 0 sein?
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Tja,

    hat sich irgendwer gedacht "Ne Zahl kann nicht NULL sein"...
    "Wenn der Kunde dat will, soller es expliziet schreiben!!!"

    Find ich gar nicht so schlecht.
    Gerade bei Preisberechnungen is mir latte ob da 0€ oder NULL raus kommt.
    Dat isn Fehler. Wenn ich beides einzeln prüfe, dann hab ich mehr Tipparbeit.
    Wenn ich es differenzieren möchte, dann sag ich es bei der Definition der Variable.

    Ist alles reine Gewohnheitssache.
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Nja aber es macht einen Unterschied, ob ich nicht weiß wie viel etwas wert ist, oder ob es 0€ wert ist. VB geht da standardmäßig einfach drüber hinweg.
    Ich sehe darin eher eine Fehlerquelle als einen Vorteil.

    Aber im Endeffekt ist es müßig darüber zu Diskutieren, weil sich an der Ausgangssituation eh nichts ändern wird. Danke nochmal für die Aufklärung :thumbsup:
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Hmm?

    Integer ist ein Value-Type, und Value-Typen können nicht Nothing sein. (Beachte: Vb -Nothing, c# -null).
    Integer? hingegen ist ausgeschrieben der Datentyp Nullable(Of Integer) - das ist was anderes, und etwas spezielles.

    Zuvor aber noch zu Value-Typ versus Reference-Typ:
    RefType-Variable enthalten immer nur einen 4 Byte breiten Zeiger ("Referenz") auf eine Speicherstelle mit den Daten.
    ValueType-Variablen enthalten die Daten direkt.
    RefTypen können auf Nothing zeigen, dann weiß man, dass diese Variable nichts enthält.
    ValueTypen können das nicht, sondern deren Variablen haben immer so viel Memory alloziiert, wie die Daten Platz beanspruchen. Und eine Value-Typ-Variable gibt immer diese Daten zurück, und das ist immer irgendetwas - niemals Nothing.
    Der Daten-Platz von Value-Typen wird auch immer mit 0-Bytes initialisiert, und deshalb ergibt der Default-Wert eines Integers, also ein Int, den man noch nie etwas zugewiesen hat, trotzdem automatisch 0.
    In c# ruft man den Default-Wert von Value-Types mit dem Schlüsselwort defautl<T> ab, in Vb muss das Schlüsselwort Nothing dafür herhalten.

    Integer? nu ist die Kurzschreibe von Nullable(Of Integer), und Nullables sind besondere Structures, die quasi die Quadratur des Kreises betreiben, also das eiglich unmögliche halt doch ermöglichen.
    Intern besteht ein Nullable aus 2 Werten: Value und HasValue, und dann ist natürlich klar, warum ein Integer? doch den Zustand "Nicht gesetzt" annehmen kann, obwohls eiglich ein ValueTyp ist, der nicht auf Nothing zeigen kann.
    Dazu noch bischen syntaktischer Zucker, dass man die umständlichkeiten im Hintergrund nicht mehr so mitbekommt

    ErfinderDesRades schrieb:

    In c# ruft man den Default-Wert von Value-Types mit dem Schlüsselwort defautl<T> ab
    default(T), das ist kein Typparameter.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Nullable (Of T) sind äquivalent zu einem Pointer auf ein <T> in C++.
    Einziger praktischer Unterschied: in .NET ist das Ding initial genullt, in C++ muss es initial genullt werden. In .NET wird das durch Zuweisung belegt, in C++ durch new T.
    Vorteil: Man kann unterscheiden, ob "das Ding" in einer Routine angefasst wurde (==> HasValue ist True) oder nicht.
    Wenn Parameter durch viele Aufrufebenen durchgereicht werden, ist ein Nullable (Of T) von Vorteil, denn erst in der verarbeitenden Routine wird "das Ding" belegt. Wenn der Aufruf vorher abgebrochen wird, hat "das Ding" keinen Wert (==> HasValue ist False). Dazu bräuchte man sonst ein separates Flag, das "das Ding" halt an Bord hat.
    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!