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

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

EDIT: Если вы считаете, что оба они одинаково приемлемы, считаете ли вы, что лучше всего выбрать один и придерживаться его, или это нормально, чтобы их смешивать?

Ответ 1

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

Причина, по которой я склоняюсь к использованию "Ничего", когда я отрицаю, становится "IsNot Nothing", а не "Not IsNothing (object)", который я лично считаю более читаемым.

Ответ 2

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

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

Редактировать - проголосовать за комментарий здесь

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

Ответ 3

Вам следует избегать использования IsNothing()

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

  • Самое главное, 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 Is не принимает операнды типа Integer.
    Операнды должны быть ссылочными или нулевыми типами.

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

  • Его медленный - на 33,76% медленнее на самом деле (более 1000000000 итераций)!

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

    то есть. это x? --- НЕ Является ли x свойством?

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

Ответ 4

Я согласен с "Ничего". Как указано выше, легко отказаться от "IsNot Nothing".

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

If printDialog IsNot Nothing Then
    'blah
End If

чем это...

If Not obj Is Nothing Then
    'blah
End If

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Я также предпочитаю использовать версию Is Nothing частично из-за ее использования так же, как и в SQL.

Ответ 8

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

Ответ 9

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