Ничто не равняется Строке. Пустой, пустой не равняется Строке. Пустой, что я пропускаю здесь?

В смешанном проекте кода (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 (????)

Как это даже возможно? Эта некоторая проблема обратной совместимости?

10
задан Abel 16 December 2016 в 23:05
поделиться

2 ответа

Ничто не имеет специального значения в VB для строк. Чтобы проверить, является ли ссылка на строку нулевой, вам необходимо:

If value Is Nothing

Из документации операторов сравнения VB :

При числовом сравнении Nothing обрабатывается как 0. При сравнении строк Nothing рассматривается как "" (пустая строка).

Я подозреваю, что это просто для обратной совместимости с VB6 - это не то, чем я был бы доволен, если бы я был разработчиком VB.

Сравнение формы

If value = Nothing

компилируется для вызова Microsoft.VisualBasic.CompilerServices.Operators.CompareString , который возвращает 0 (т.е. равно), если один операнд равен нулю, а другой пуст.

16
ответ дан 3 December 2019 в 18:30
поделиться

Вы хотите

If Not String.IsNullOrEmpty(Request.Params("xxx") Then
    ...
End If

или

if (!String.IsNullOrEmpty(Request.Params("xxx")) {
    ...
}
1
ответ дан 3 December 2019 в 18:30
поделиться