Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

Вот 4 причины из статьи IsNothing() против ничего

  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владение собственностью это?

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

Я согласен с «Ничего».Как говорилось выше, его легко отрицать с помощью «IsNot Nothing».

Мне кажется, это легче читать...

If printDialog IsNot Nothing Then
    'blah
End If

чем это...

If Not obj Is Nothing Then
    'blah
End If

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top