Nothing = String.Empty (Почему они равны?) - PullRequest
25 голосов
/ 14 апреля 2010

Почему первое утверждение 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

Ответы [ 4 ]

20 голосов
/ 14 апреля 2010

Ничто в VB.net не является значением по умолчанию для типа. Спецификация языка говорит в разделе 2.4.7:

Ничто не является особым литералом; он не имеет типа и может быть преобразован во все типы в системе типов, включая параметры типов. При преобразовании в определенный тип он эквивалентен значению по умолчанию для этого типа.

Итак, когда вы тестируете против String.Empty, Nothing преобразуется в строку, имеющую длину 0. Оператор Is должен использоваться для тестирования против Nothing, а String.Empty.Equals (Nothing) также возвращает false .

7 голосов
/ 03 декабря 2015

Это особый случай операторов = и <> VB.

В спецификации языка указано в разделе 11.14:

При выполненииСравнение строк, нулевая ссылка эквивалентна строковому литералу "".


Если вас интересуют дополнительные детали, я написал подробное сравнение vbNullString, String.Empty, "" и Nothing в VB.NET здесь:

2 голосов
/ 11 января 2011

По этой теме, если вы используете строковую переменную, инициализированную «none», для присваивания свойству «value» 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
2 голосов
/ 14 апреля 2010

Попробуйте это:

Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))

Оператор = не применяет одинаковые типы, в то время как метод строкового объекта .Equals() делает так же, как и оператор Is.

...