Frage

Warum wird die erste if-Anweisung den Wert true? Ich weiß, wenn ich „ist“ anstelle von „=“ verwenden, dann wird es nicht wahr bewerten. Wenn ich String.Empty ersetzen mit „Foo“ wertet es nicht wahr. Sowohl String.Empty und „Foo“ haben die gleiche Art von String, also warum tut man wahr zu bewerten und die andere nicht?

    //this evaluates to true
    If Nothing = String.Empty Then

    End If

    //this evaluates to false
    If Nothing = "Foo" Then

    End If
War es hilfreich?

Lösung

Nichts in VB.net ist der Standardwert für einen Typ. Die Sprache spec sagt in Abschnitt 2.4.7:

  

Im Moment ist eine besondere wörtliche; es hat keinen Typen und ist für alle Arten in der Art System umwandelbar, einschließlich Typ-Parameter. Wenn auf einen bestimmten Typen umgewandelt, es ist das Äquivalent des Standardwertes dieses Typs.

Wenn Sie also gegen String.Empty testen, wird nichts in einen String umgewandelt, die eine Länge hat 0. Der Operator ist, sollte für den Test gegen Nichts verwendet werden und String.Empty.Equals (Nothing) wird auch false zurück .

Andere Tipps

Es ist ein besonderer Fall von VB = und <> Operatoren.

Die Language Specification Zustände in Abschnitt 11.14 :

  

Wenn Sie einen String-Vergleich zu tun, ein NULL-Verweis entspricht den Stringliteral "".


Wenn Sie an weiteren Details interessiert sind, habe ich einen eingehenden Vergleich der vbNullString, String.Empty, "" und Nothing in VB.NET hier geschrieben:

Versuchen Sie diese:

Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))

Der = Operator erzwingt keine gleichen Typen, während die .Equals() Methode eines String-Objekt der Fall ist, wie der Is Operator.

zu diesem Thema, wenn Sie ein String-Variable mit „nichts“ initialisiert verwenden, um die Eigenschaft zugeordnet wird „Wert“ einen SqlParameter dass Parameter ignoriert wird, nicht in dem Befehl an den Server gesendet enthält, und einen fehlenden Parameter Fehler ausgelöst. Wenn Sie diese Variable mit String.Empty geht alles in Ordnung zu initialisieren.

//This doesn't work
Dim myString as String = nothing
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString

//This works    
Dim myString as String = string.empty
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top