Ничто не равно String.empty, NULL не равна строки. Пупесть, что я здесь не хватает?

StackOverflow https://stackoverflow.com/questions/3131134

  •  01-10-2019
  •  | 
  •  

Вопрос

В смешанном кодовом проекте (VB и C #) мы отладки некоторых старого визуального базового кода, как это:

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

Я считал эту ошибку как запрос. Парамс может быть 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 (????)

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

Это было полезно?

Решение

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

If value Is Nothing

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

Числовые сравнения не относятся к 0. 0. Сравнение строки относится к «» (пустой строке).

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

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

If value = Nothing

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

Другие советы

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

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

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

Ты хочешь

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

Или

if (!String.IsNullOrEmpty(Request.Params("xxx")) {
    ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top