Подтвердить что ты не робот

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
4b9b3361

Ответ 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