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?

War es hilfreich?

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")) {
    ...
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top