Dies ist eine Frage zur VB.NET-Sprache. Da ich es jeden Tag benutze, versuche ich einfach die Motivation hinter einigen seiner Konstrukte zu verstehen.
Ich finde nur heraus, dass diese Zeile:
%Vor%ist so korrekt wie dieser:
%Vor%Gleiche Ergebnisse. Mit ildasm können wir sehen, dass diese Zeilen übersetzt werden in:
%Vor%und
%Vor%Nun, aber in VB.NET können Sie nicht schreiben:
%Vor%Der Compiler akzeptiert das nicht.
Mmm, für mich ist Wenn nichts meinObjekt ist viel weniger offensichtlich als Wenn meinObjekt = Nichts .
Warum haben VB.NET-Autoren das Gegenteil geglaubt? Irgendein Hinweis?
Das Problem, auf das Sie stoßen, ist, dass VB.Net die beiden Arten des Objektvergleichs unterscheidet. Nämlich Referenz- und Wertvergleich.
Der Operator "Is" in VB.Net dient zum Referenzvergleich. Dies kann verwendet werden, wenn die betreffenden Werte beide Referenztypen oder NULL-Werte sind. Der Versuch, Werttypen auf diese Weise zu vergleichen, führt zu einem Kompilierungsfehler.
Der Operator "=" wird für den Wertevergleich verwendet. Der Wertvergleich kann nur für Typen verwendet werden, die ein explizites =, & lt; & gt; Operatorpaar in ihrer Klassendefinition. Die tatsächliche Umsetzung der Gleichstellung hängt von der Implementierung des Betreibers ab.
C # verwendet einen anderen Ansatz, indem es == sowohl für den Wert als auch für den Referenzvergleich verwendet. Welche verwendet wird, hängt von einigen Faktoren ab, einschließlich der Art der verglichenen Werte und der Implementierung bestimmter Gleichheitsverfahren.
Es ist eines dieser Dinge, die von VB6 und COM geerbt wurden. VB6 unterscheidet zwischen Referenztypobjekten (die instanziierbar sind) und nativen Typen wie int. Referenztypen müssen mit dem Operator "Set" erstellt und zugewiesen werden, während native Typen einfach "=" verwenden.
Nun, in einigen Fällen können Sie If myObject = Nothing Then
schreiben, aber es wird kein Null-Vergleich sein:
Der obige Code entspricht dem folgenden:
%Vor% In diesem Fall haben Sie einen Werttyp mit dem Wert "empty" (0 für Integer
, Point.Empty
für eine Point
-Struktur als Beispiele). Der Is-Operator führt einen -Referenzvergleich durch (überprüft, ob die verglichenen Objekte dieselbe Instanz sind), während das Gleichheitszeichen ein -Wertvergleich ist.
Die Verwendung von Is Nothing
ist ein Konstrukt, das auf die Tage des klassischen Visual Basic (d. h. 6.0 und darunter) zurückgeht.
Um eine gewisse Kompatibilität aufrechtzuerhalten (genau wie VB6 die nicht-faule Auswertung der If
-Anweisung behandelt), wurde diese in VB.NET übernommen.
Glücklicherweise als ocdecio weist darauf hin, dass es andere ähnliche peccadillos gab, die nicht in VB.NET übernommen wurden, wie die Set
-Anweisung für die Zuweisung von Objekten zu Variablen.
Tags und Links .net compiler-construction vb.net