Nothing = String.Empty(почему они равны?)
Почему первый оператор if имеет значение true? Я знаю, если я использую "is" вместо "=", то он не будет оценивать true. Если я заменил String.Empty на "Foo", он не будет равен true. И String.Empty, и Foo имеют один и тот же тип String, поэтому почему вы оцениваете значение true, а другое - нет?
//this evaluates to true
If Nothing = String.Empty Then
End If
//this evaluates to false
If Nothing = "Foo" Then
End If
Ответы
Ответ 1
Ничто в VB.net не является значением по умолчанию для типа. спецификация языка говорит в разделе 2.4.7:
Ничто не является специальным литералом; он не имеет типа и может быть конвертирован ко всем типам системы типов, включая параметры типа. При преобразовании в конкретный тип это эквивалентно значению по умолчанию этого типа.
Итак, когда вы проверяете String.Empty, Nothing не преобразуется в строку, длина которой равна 0. Оператор Is должен использоваться для тестирования против Nothing, а String.Empty.Equals(Nothing) также возвращает false.
Ответ 2
Это частный случай операторов VB =
и <>
.
Спецификация языка в разделе 11.14 гласит:
При сравнении строк пустая ссылка эквивалентна строковому литералу "".
Если вас интересуют дальнейшие подробности, я написал подробное сравнение vbNullString
, String.Empty
, ""
и Nothing
в VB.NET здесь:
Ответ 3
Попробуйте следующее:
Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))
Оператор =
не применяет одинаковые типы, тогда как метод .Equals()
выполняет строковый объект, также как и Is
.
Ответ 4
В связи с этим вопросом, если вы используете строковую переменную, инициализированную с "ничего", которая должна быть назначена значению свойства SqlParameter, этот параметр игнорируется, не включается в команду, отправленную на сервер, и отсутствующий параметр ошибка выбрасывается.
Если вы инициализируете эту переменную с помощью string.empty, все будет хорошо.
//This doesn't work
Dim myString as String = nothing
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString
//This works
Dim myString as String = string.empty
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString