Ніщо ні проти чого


130

Хтось тут використовує VB.NET і має сильну перевагу щодо або проти використання IsNothingна відміну від Is Nothing(наприклад, If IsNothing(anObject)або If anObject Is Nothing...)? Якщо так, то чому?

EDIT: Якщо ви вважаєте, що обидва вони однаково прийнятні, чи вважаєте ви, що найкраще вибрати один і дотримуватися його, чи це добре їх змішувати?


3
Є багато вагомих причин уникати використанняIsNothing()
KyleMit

@JesseChisholm, Занадто багато для одного коментаря, але мій попередній коментар розмістив це посилання на статтю, що містить 5 різних blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.html
KyleMit

Відповіді на техніку справді цікаві, але соромно, що питання було залишено занадто відкритим, і відповіді на це не давали жодної користі, лише все більш розпливчасті особисті переваги
underscore_d

Відповіді:


125

Якщо ви подивитеся на MSIL під час його виконання, ви побачите, що він не компілюється в точно той же код. Якщо ви використовуєте IsNothing (), він фактично робить виклик цього методу, а не просто оцінювати вираз.

Причиною, якою я схиляюся до використання "Is Nothing", є те, що я заперечую, це стає "IsNot Nothing", а не "Not IsNothing (об'єкт)", який я особисто відчуваю виглядає легше.


46

Я вважаю, що Патрік Стіл найкраще відповів на це питання у своєму блозі: Avoying IsNothing ()

Я не копіював тут жодної його відповіді, щоб гарантувати, що Патрік Стіл отримав честь своєї посади. Але я думаю, що якщо ви намагаєтесь вирішити, використовувати Is Is Nothing чи IsNothing, ви повинні прочитати його допис. Я думаю, ти погодишся, що Is Nothing - це найкращий вибір.

Редагувати - коментар VoteCoffe тут

Частковий вміст статті: Переглянувши більше коду, я з’ясував ще одну причину, чому вам слід цього уникати: він приймає типи значень! Очевидно, оскільки IsNothing () є функцією, яка приймає 'об'єкт', ви можете передавати йому все, що завгодно. Якщо це тип значення, .NET введе його в об'єкт і передасть IsNothing - це завжди поверне помилкове значення в коробці! Компілятор VB.NET перевірить синтаксис стилю "Ніщо" і не компілюватиметься, якщо ви спробуєте зробити "Немає нічого" для типу значення. Але функція IsNothing () компілюється без нарікань. -PSteele - VoteCoffee


7
Частковий вміст статті: Переглянувши більше коду, я з’ясував ще одну причину, чому вам слід цього уникати: він приймає типи значень! Очевидно, оскільки IsNothing () є функцією, яка приймає 'об'єкт', ви можете передавати йому все, що завгодно. Якщо це тип значення, .NET введе його в об'єкт і передасть IsNothing - це завжди поверне помилкове значення в коробці! Компілятор VB.NET перевірить синтаксис стилю "Ніщо" і не компілюватиметься, якщо ви спробуєте зробити "Немає нічого" для типу значення. Але функція IsNothing () компілюється без нарікань. -PSteele
VoteCoffee

7
Опублікував частину вмісту, оскільки ніколи не знаєш, чи посилання стане мертвою, і я подумав, що це додало хорошого моменту в обкладинці.
VoteCoffee

33

Вам слід абсолютно уникати використання IsNothing()

Ось 4 причини зі статті IsNothing () VS Is Nothing

  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

    Не буде компілювати, натомість компілятор призведе до помилки:

    Оператор 'є' не приймає операнди типу 'Integer'.
    Операнди повинні бути типовими або нульовими типами.

  2. IsNothing(object)насправді є частиною частини Microsoft.VisualBasic.dll.
    Це небажано, оскільки у вас є непотрібна залежність від бібліотеки VisualBasic.

  3. Її повільність - на 33,76% повільніше насправді (понад 1000000000 ітерацій)!

  4. Можливо, особисті переваги, але 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

5

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

Я віддаю перевагу IsNothing () ... але я використовую C і C #, тому це просто те, що зручно. І я думаю, що це читабельніше. Але йди з тим, що тобі зручніше.


3
Ваше посилання є мертвим, тому що його варто тут жити: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/… Варто зауважити, що, всупереч поширеній думці, це неправда.
Метт Вілько

5

Я схиляюся до альтернативи "Немає нічого", перш за все тому, що це здається більше ОО.

Напевно Visual Basic не має ключового слова Ain't.


Чи може VB.NET робити методи розширення? :)
klkitchens

2

Я також схильний частково використовувати версію Is Nothing, щоб використовувати її так само, як і в SQL.


1

Спочатку я використовував IsNothing, але я рухався до використання Is Nothing у нових проектах, головним чином для читабельності. Єдиний раз, коли я тримаюсь за IsNothing, це якщо я підтримую код там, де він використовується протягом усього часу, і я хочу залишатися послідовною.


-2

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


Це неправильно. Ви впевнені, що не зрозуміли це неправильно? " IsNothing призначений для роботи над еталонними типами. Тип значення не може містити значення Nothing і повертається до його значення за замовчуванням, якщо ви присвоїли Nothing [...] IsNothing завжди повертає False ." Але "Представляє значення за замовчуванням для будь-якого типу даних. [...] Для типів значень [це] залежить від того, чи є тип значення нульовим." Так не краще? Nothing Is Nothing
підкреслюй_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.