IsNothing против Is Nothing


130

Кто-нибудь здесь использует VB.NET и имеет сильные предпочтения за или против использования IsNothingв отличие от Is Nothing(например, If IsNothing(anObject)или If anObject Is Nothing...)? Если так, то почему?

РЕДАКТИРОВАТЬ: Если вы считаете, что они оба одинаково приемлемы, как вы думаете, лучше всего выбрать один и придерживаться его, или можно их смешать?


3
Есть много веских причин избегать использованияIsNothing()
KyleMit

@JesseChisholm, для одного комментария слишком много, но в моем предыдущем комментарии была размещена эта ссылка на статью, в которой перечислены 5 разных статей blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

Технические ответы действительно интересны, но жаль, что вопрос был оставлен слишком открытым и дал некоторые ответы без
underscore_d

Ответы:


125

Если вы посмотрите на MSIL во время его выполнения, вы увидите, что он не компилируется до того же самого кода. Когда вы используете IsNothing (), он фактически вызывает этот метод, а не просто вычисляет выражение.

Причина, по которой я склоняюсь к использованию «Is Nothing», заключается в том, что когда я отрицаю, это становится «IsNot Nothing», а не «Not IsNothing (объект)», что, по моему мнению, выглядит более читаемым.


46

Я считаю, что Патрик Стил лучше всего ответил на этот вопрос в своем блоге: Avoiding IsNothing ()

Я не копировал здесь ни одного его ответа, чтобы гарантировать, что Патрик Стил заслужил признание своей должности. Но я думаю, что если вы пытаетесь решить, использовать ли Is Nothing или IsNothing, вам следует прочитать его пост. Думаю, вы согласитесь, что Is Nothing - лучший выбор.

Изменить - комментарий VoteCoffe здесь

Частичное содержание статьи: Изучив дополнительный код, я обнаружил еще одну причину, по которой этого следует избегать: он принимает типы значений! Очевидно, поскольку IsNothing () - это функция, которая принимает «объект», вы можете передать ей все, что захотите. Если это тип значения, .NET поместит его в объект и передаст в IsNothing - который всегда будет возвращать false для упакованного значения! Компилятор VB.NET проверит синтаксис стиля «Is Nothing» и не будет компилировать, если вы попытаетесь сделать «Is Nothing» для типа значения. А вот функция IsNothing () компилируется без нареканий. -PSteele - ГолосоватьКофе


7
Частичное содержание статьи: Изучив дополнительный код, я обнаружил еще одну причину, по которой вам следует избегать этого: он принимает типы значений! Очевидно, поскольку IsNothing () - это функция, которая принимает «объект», вы можете передать ей все, что захотите. Если это тип значения, .NET поместит его в объект и передаст в IsNothing, который всегда будет возвращать false для упакованного значения! Компилятор VB.NET проверит синтаксис стиля «Is Nothing» и не будет компилировать, если вы попытаетесь сделать «Is Nothing» для типа значения. А вот функция IsNothing () компилируется без нареканий. -PSteele
VoteCoffee

7
Разместил часть содержимого, так как никогда не знаешь, станет ли ссылка мертвой, и я подумал, что это добавило хороший момент обложке.
VoteCoffee

33

Вы должны категорически избегать использования IsNothing()

Вот 4 причины из статьи IsNothing () VS Is Nothing

  1. Самое главное, IsNothing(object)все ли передано ему как объект, даже типы значений! Поскольку типов значений не может быть Nothing, это напрасная проверка.
    Возьмите следующий пример:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If

    Это будет компилироваться и работать нормально, тогда как это:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If

    Компилировать не будет, вместо этого компилятор выдаст ошибку:

    Оператор Is не принимает операнды типа Integer.
    Операнды должны быть ссылочного типа или типа, допускающего значение NULL.

  2. IsNothing(object)фактически является частью Microsoft.VisualBasic.dll.
    Это нежелательно, так как у вас есть ненужная зависимость от библиотеки VisualBasic.

  3. Это медленно - на самом деле на 33,76% медленнее (более 1000000000 итераций)!

  4. Возможно личное предпочтение, но IsNothing()читается как условие Йоды . Когда вы смотрите на переменную, вы проверяете ее состояние и рассматриваете ее как предмет вашего исследования.

    т.е. делает ли он x? --- НЕ ли xИНГИ свойства него ?

    Так что я думаю, что If a IsNot Nothingлучше, чемIf Not IsNothing(a)


29

Я согласен с "Нет ничего". Как было сказано выше, легко отрицать «IsNot Nothing».

Мне это легче читать ...

If printDialog IsNot Nothing Then
    'blah
End If

чем это...

If Not obj Is Nothing Then
    'blah
End If

5

VB полон подобных вещей, пытаясь сделать его «похожим на английский» и удобным для людей, которые привыкли к языкам, которые часто используют () и {}. Например, на стороне "как английский" ... VB имеет ключевое слово " Ain't " ... и нет, я не шучу. И с другой стороны, как вы, вероятно, уже знаете, большую часть времени вы можете использовать () с вызовами функций, если хотите, но не обязательно.

Я предпочитаю IsNothing () ... но использую C и C #, так что это как раз то, что удобно. И мне кажется, это более читабельно. Но выбирайте то, что вам удобнее.


3
Ваша ссылка мертва, поэтому ее ценность здесь остается живой: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/ ... Однако стоит отметить, что вопреки распространенному мнению, это не правда.
Мэтт Вилко

5

Я склоняюсь к альтернативе «Нет ничего», в первую очередь потому, что она кажется более объектно ориентированной.

Конечно , Visual Basic не получил ли не ключевое слово.


Может ли VB.NET использовать методы расширения? :)
klkitchens


1

Изначально я использовал IsNothing, но постепенно перехожу к использованию Is Nothing в новых проектах, в основном для удобства чтения. Единственный раз, когда я придерживаюсь IsNothing, это если я поддерживаю код, в котором он используется повсюду, и хочу оставаться последовательным.


-2

Is Nothing требует объекта, которому присвоено значение Nothing. IsNothing () может принимать любую переменную, которая не была инициализирована, в том числе числового типа. Это полезно, например, при проверке передачи необязательного параметра.


Это не верно. Вы уверены, что не ошиблись? « IsNothing предназначен для работы со ссылочными типами. Тип значения не может содержать значение Nothing и возвращается к своему значению по умолчанию, если вы назначаете Nothing [...] IsNothing всегда возвращает False ». Но «Представляет значение по умолчанию для любого типа данных. [...] Для типов значений [это] зависит от того, допускает ли тип значения значение NULL». Так не лучше? Nothing Is Nothing
underscore_d
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.