VB.NET Sprache und Nichts: Warum ist es so?

7

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?

    
SRO 23.06.2009, 19:29
quelle

5 Antworten

25

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.

    
JaredPar 23.06.2009, 19:33
quelle
4

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.

    
Otávio Décio 23.06.2009 19:34
quelle
3

Nun, in einigen Fällen können Sie If myObject = Nothing Then schreiben, aber es wird kein Null-Vergleich sein:

%Vor%

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.

    
Fredrik Mörk 23.06.2009 19:35
quelle
1

Ein anderer Gedanke ist, dass VB ausführlicher sein soll, wenn Sie sich die Schleifen- und Konditionalsyntax ansehen. Ein paar Beispiele:

VB:

%Vor%

C #

%Vor%

Sehen Sie alle zusätzlichen Wörter im VB.Net-Code? Das ist ein weiterer möglicher Grund für den Unterschied.

    
JB King 23.06.2009 19:38
quelle
1

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.

    
Kev 23.06.2009 19:37
quelle