VB.NET - Ничто против Ничего - PullRequest
126 голосов
/ 08 августа 2008

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

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

Ответы [ 9 ]

120 голосов
/ 08 августа 2008

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

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

43 голосов
/ 11 августа 2008

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

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

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

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

31 голосов
/ 30 июня 2014

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

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

  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».
    Операнды должны быть ссылочными или обнуляемыми типами.

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

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

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

    т.е. это делает х? --- NOT Является ли x свойством it ?

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

29 голосов
/ 08 августа 2008

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

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

If printDialog IsNot Nothing Then
    'blah
End If

чем это ...

If Not obj Is Nothing Then
    'blah
End If
5 голосов
/ 08 августа 2008

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

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

5 голосов
/ 08 августа 2008

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

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

2 голосов
/ 08 августа 2008

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

1 голос
/ 08 августа 2008

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

0 голосов
/ 06 марта 2016

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

...