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

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

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

8.08.2008 09:45:29
Есть много веских причин избегать использованияIsNothing()
KyleMit 26.02.2014 18:37:59
@JesseChisholm, слишком много для отдельного комментария, но мой предыдущий комментарий разместил эту ссылку на статью, в которой перечислено 5 разных blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit 30.06.2014 15:45:21
Технические ответы действительно интересны, но позор, что вопрос был оставлен слишком открытым и вызвал некоторые ответы без
underscore_d 23.11.2017 21:25:31
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

125
8.08.2008 12:28:37

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

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

5
8.08.2008 09:49:51
Ваша ссылка мертва, так что ее ценность здесь живая: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… Однако стоит отметить, что вопреки распространенному мнению не правда.
Matt Wilko 30.05.2013 13:54:29

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

Конечно, Visual Basic не имеет ключевого слова Ain't.

5
8.08.2008 10:57:27
Может ли VB.NET использовать методы расширения? :)
klkitchens 17.03.2009 20:08:21

Я также склонен частично использовать версию «Ничего», поскольку я использую ее в SQL.

2
8.08.2008 12:29:25

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

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

If printDialog IsNot Nothing Then
    'blah
End If

чем это...

If Not obj Is Nothing Then
    'blah
End If
29
8.08.2008 13:11:51

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

1
8.08.2008 13:24:51

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

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

Редактировать - здесь VoiceCoffe комментирует

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

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

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

    т.е. это делает х? --- НЕ ли xИНГИ свойства него ?

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

33
30.06.2014 16:07:10

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

-2
6.03.2016 04:23:28
Это не верно. Вы уверены, что не поняли это неправильно? « IsNothing предназначен для работы со ссылочными типами. Тип значения не может содержать значение Nothing и возвращается к значению по умолчанию, если назначить Nothing [...] IsNothing всегда возвращает False ». Но «Представляет значение по умолчанию для любого типа данных. [...] Для типов значений [это] зависит от того, является ли тип значения обнуляемым». Так не лучше? Nothing Is Nothing
underscore_d 23.11.2017 21:30:21