В смешанном проекте кода (VB и C#) мы отлаживали некоторый старый код Visual Basic как это:
If Request.Params("xxx") <> "" Then
'do something
Я считал это ошибкой как Запрос. Params мог быть null
, в этом случае оператор стал бы ложью, которая не была идеей.
Таким образом, я думал. Я просто узнал - снова - что VB's Nothing
и C# null
не то же самое и Nothing
не то же как null
.Действительно:
if(String.Empty == null) // in C# this is always false (correct)
If String.Empty = Nothing Then ' in VB this is always true (????)
Как это даже возможно? Эта некоторая проблема обратной совместимости?
Ничто
не имеет специального значения в VB для строк. Чтобы проверить, является ли ссылка на строку нулевой, вам необходимо:
If value Is Nothing
Из документации операторов сравнения VB :
При числовом сравнении Nothing обрабатывается как 0. При сравнении строк Nothing рассматривается как "" (пустая строка).
Я подозреваю, что это просто для обратной совместимости с VB6 - это не то, чем я был бы доволен, если бы я был разработчиком VB.
Сравнение формы
If value = Nothing
компилируется для вызова Microsoft.VisualBasic.CompilerServices.Operators.CompareString
, который возвращает 0 (т.е. равно), если один операнд равен нулю, а другой пуст.
Вы хотите
If Not String.IsNullOrEmpty(Request.Params("xxx") Then
...
End If
или
if (!String.IsNullOrEmpty(Request.Params("xxx")) {
...
}