VB.NET - Ничто против Ничего

125

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

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

  • 3
    Есть много веских причин избегать использования IsNothing()
  • 0
    @JesseChisholm, слишком много для отдельного комментария, но мой предыдущий комментарий разместил эту ссылку на статью, которая перечисляет 5 разных blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
Показать ещё 1 комментарий
Теги:
nothing

9 ответов

112
Лучший ответ

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

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

44

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

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

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

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

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

Вам следует избегать использования 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)

29

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

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

If printDialog IsNot Nothing Then
    'blah
End If

чем это...

If Not obj Is Nothing Then
    'blah
End If
6

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

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

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

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

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

2

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

1

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

-2

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

  • 0
    Это не верно. Вы уверены, что не поняли это неправильно? « IsNothing предназначено для работы со ссылочными типами. Тип значения не может содержать значение Nothing и возвращается к значению по умолчанию, если назначить Nothing [...] IsNothing всегда возвращает False ». Но Nothing «Представляет значение по умолчанию для любого типа данных. [...] Для типов значений [это] зависит от того, является ли тип значения обнуляемым». Так не Is Nothing , лучше?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню