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


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

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

9 120

9 ответов:

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

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

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

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

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

Я считаю, что это легче читать...

If printDialog IsNot Nothing Then
    'blah
End If

чем этот...

If Not obj Is Nothing Then
    'blah
End If

вы должны абсолютно избегать использования 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() читается как Состояние Йода. Когда вы смотрите на переменную, вы проверяете ее состояние, и она является предметом вашего исследования.

    т. е. это do x? --- не и xing свойство это?

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

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

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

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

Конечно Visual Basic не у Не сайта.

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

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

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