Ничто не равно String.Empty, null не равно String.Empty, что мне здесь не хватает? - PullRequest
10 голосов
/ 28 июня 2010

В проекте со смешанным кодом (VB и C #) мы отлаживали некоторый старый код Visual Basic, такой как:

If Request.Params("xxx") <> "" Then
   'do something

Я посчитал это ошибкой, так как Request.Params мог бы быть null, в этом случае утверждение стало бы ложным, что не было идеей.

Так я и думал. Я только что узнал - опять же - что VB 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 (????)

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

Ответы [ 3 ]

16 голосов
/ 28 июня 2010

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

If value Is Nothing

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

Числовые сравнения трактуют Ничто как 0. Сравнение строк обрабатывает Nothing как "" (пустая строка).

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

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

If value = Nothing

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

4 голосов
/ 12 августа 2011

В vb6 значением по умолчанию для строковой переменной была пустая строка.Программист vb6, полагающийся на такое поведение, будет не «хуже», чем программист на C, полагающийся на нулевую инициализацию по умолчанию переменных int;оба поведения были определены как часть языка.

Кроме того, в COM (структура, на которой основывались предыдущие версии VB6), всякий раз, когда создавалась ссылка на строку, кто-то должен был бы вручную утилизировать ее.,Поскольку наиболее часто используемой строкой была пустая строка, многие COM-методы явно документированы как относящиеся к нулевому указателю как к пустой строке.Это означает, что функция, возвращающая пустую строку или передающая ее в качестве параметра значения или возвращающая ее, может просто передать нулевой указатель без необходимости выделять что-либо;получатель нулевого указателя не должен будет ничего перераспределять.

Поскольку объекты в .net не требуют явного освобождения, преимущества в производительности, связанные с рассмотрением пустой ссылки как пустой строки, больше не применяются.Тем не менее, методы, которые вызываются из кода, который может ожидать поведение, подобное поведению COM-методов, часто будут считать ссылки на нулевые строки такими же, как пустые строки.

1 голос
/ 28 июня 2010

Вы хотите

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

Или

if (!String.IsNullOrEmpty(Request.Params("xxx")) {
    ...
}
...