Ничто против Ничего

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

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

Ответов (8)

Решение

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

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

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

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

If printDialog IsNot Nothing Then
    'blah
End If

чем это...

If Not obj Is Nothing Then
    'blah
End If

Вы должны категорически избегать использования 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)

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

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

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

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

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

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

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

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

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

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