Nichts gleicht String.Empty, null nicht gleich String.Empty, was soll ich hier fehlt?
-
01-10-2019 - |
Frage
In einem gemischten Code-Projekt (VB und C #) wurden wir Debuggen einige alte Visual Basic-Code wie folgt aus:
If Request.Params("xxx") <> "" Then
'do something
Ich betrachtete dies ein Fehler als Request.Params null
sein könnte, wobei in diesem Fall die Aussage worden falsch haben würde, das nicht die Idee war.
dachte Also ich. Ich habe gerade herausgefunden - wieder - das VB Nothing
und C # 's null
sind nicht die gleichen Dinge und Nothing
ist nicht das gleiche wie null
. In der Tat:
if(String.Empty == null) // in C# this is always false (correct)
If String.Empty = Nothing Then ' in VB this is always true (????)
Wie ist das überhaupt möglich? Ist das eine Abwärtskompatibilität Problem?
Lösung
Nothing
hat eine besondere in VB Bedeutung für Streicher. Um herauszufinden, ob ein String Referenz null, benötigen Sie:
If value Is Nothing
Aus der VB Vergleichsoperator Dokumentation :
Numerische Vergleiche behandeln Nichts als 0. String Vergleiche behandeln Nichts als "" (eine leere Zeichenkette).
Ich vermute, dass dies nur für die Abwärtskompatibilität mit VB6 ist -. Es ist nicht etwas, das ich mit glücklich wäre, wenn ich ein VB-Entwickler sind
Ein Vergleich der Form
If value = Nothing
ist mit einem Aufruf zu erstellenden Microsoft.VisualBasic.CompilerServices.Operators.CompareString
0, welche (dh gleich sind), wenn man kehrt Operand gleich null ist und die andere leer ist.
Andere Tipps
In VB6 war der Standardwert für ein String-Variable eine leere Zeichenfolge. Ein VB6 Programmierer auf ein solches Verhalten unter Berufung würde nicht „schlechter“ als ein C-Programmierer sein Vertrauen auf Standard-Null-Initialisierung von int Variablen; beide Verhaltensweisen, die als Teil der Sprache angegeben wurden.
Ferner wird in COM (der Rahmen, auf denen frühere Versionen von VB6 beruhten), jederzeit ein Verweis auf Zeichenfolge erstellt wurde, würde jemand manuell dispose davon hat. Da die am häufigsten verwendeten Zeichenfolge die leere Zeichenkette war, viele COM-Methoden, wie in Bezug auf einen Nullzeiger als gleichwertig mit einem leeren String explizit dokumentiert. Dies bedeutet, dass eine Funktion, eine leere Zeichenfolge oder Weitergabe einer als Parameterwert zurückkehrt oder eine Rückkehr einfach einen Nullzeiger übergeben können, ohne irgendetwas zu vergeben hat; der Empfänger der Null-Zeiger muß dann etwas nicht de-zuweisen.
Da Objekte in .net keine explizite Freigabe erfordern, der die Leistungsvorteile eine Nullreferenz als eine leere Zeichenfolge in Bezug auf nicht mehr gelten. Dennoch Methoden, die von Code aufgerufen werden, die das Verhalten ähnlich dem von COM-Methoden erwarten oft Null-String Referenzen betrachten als die gleiche wie leere Strings zu sein.
Sie möchten
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
oder
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}