Frage

Dies ist eine Frage über die VB.NET Sprache. Da ich es jeden Tag benutzen, versuche ich nur die Motivationen hinter einigen seiner Konstrukten zu verstehen.

ich herausfinden, dass diese Zeile:

If myObject Is Nothing then

ist als die richtige dies ist:

If Nothing Is myObject Then

Die gleiche Ergebnis. Mit ildasm, können wir sehen, dass diese Zeilen übersetzt werden:

if myObject = null then

und

if null = myObject then

Nun ja, aber in VB.NET, können Sie nicht schreiben:

if myObject = Nothing Then

Der Compiler wird das nicht akzeptieren.

Mmm, zu mir, Wenn nichts myObject ist viel weniger offensichtlich als Wenn myObject = Nothing .

Warum VB.NET Autoren denken genau das Gegenteil? Jeder Hinweis?

War es hilfreich?

Lösung

Das Problem in Sie laufen, ist, dass VB.Net die zwei Arten von Objektvergleich unterscheidet. Referenz und Wert Vergleich nämlich.

Die „Ist“ Operator in VB.Net wird als Referenz Vergleich verwendet. Dies kann verwendet werden, wenn die Werte in Frage beiden Typen Bezug sind oder nullables. Der Versuch, Werttypen vergleichen i diese Art und Weise in einem Übersetzungsfehler führen.

Der Operator "=" wird für Value Vergleich verwendet. Der Wertvergleich kann nur auf Arten verwendet werden, die eine explizite = definieren, <> Operator-Paar in ihre Klassendefinition. Die tatsächliche Umsetzung der Gleichstellung hängt von der Implementierung des Betreibers.

C # hat einen anderen Ansatz, dass es == sowohl verwendet für Wert und Referenzvergleich. Die verwendet wird, hängt von einer Reihe von Faktoren ab, einschließlich der Art der die Werte und die Durchführung bestimmter Gleichheit Methoden verglichen werden.

Andere Tipps

Es ist eines dieser Dinge von VB6 und COM geerbt. VB6 macht einen Unterschied zwischen Objekten Referenztyp (die instantiable sind) und native Typen wie int. Referenztypen hatten mit dem „Set“ Operator erstellt und zugewiesen werden, während native Typen einfach verwendet „=“.

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

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

Der obige Code entspricht der folgenden:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

In diesem Fall haben Sie einen Werttyp, der seinen "emtpy" Wert (0 für eine Integer hat, Point.Empty für eine Point Struktur als Beispiele). Der Is-Operator führt eine Referenz Vergleich (zu überprüfen, ob die verglichenen Objekte dieselbe Instanz sind), während das Gleichheitszeichen ein Wertvergleich ist.

Ein weiterer Gedanke ist VB soll ausführlicher sein, wenn Sie einen Teil der Schleife und bedingter Syntax betrachten. Ein paar Beispiele:

VB:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

C #

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

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

Die Verwendung von Is Nothing ist ein Konstrukt, das zurück zu den Tagen des klassischen Visual Basic (das heißt 6,0 und unten).

geht

Um eine gewisse semblence der Kompatibilität beibehalten (ebenso wie die Art und Weise VB6 Griffe nicht faul Auswertung der If Anweisung) diese über in VB.NET durchgeführt wurde.

Zum Glück, wie ocdecio weist darauf hin, gibt es noch andere ähnliche Kavaliersdelikte waren, die für die Zuordnung von Objekten zu Variablen vorwärts in VB.NET wie die Set Anweisung nicht ausgeführt wurden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top