(любой == System.DBNull.Value) vs (любой - System.DBNull)

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

if (any is System.DBNull)

такой же как:

if (any == System.DBNull.Value)

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
5 388
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

if (any == System.DBNull.Value) ...

Я предпочитаю это просто потому, что я читаю это как сравнение значений, а не типов.

Разве это не приведет к исключению, если переменная any не относится к типу object? Например, строка? Сравнение строки с DBNull не удастся.

David Klempfner 08.07.2020 05:21

если вы используете C#, вам следует использовать ==; is использует отражение, которое требует больших затрат на вычисление, тем более что существует только один экземпляр System.DBNull.

-1 за неверное утверждение is uses reflection. При использовании is проблем с производительностью нет. (Чтобы быть более точным, то, что обычно называют "использованием отражения", - это использование методов в System.Reflection. Которые действительно медленные. Так что, махая рукой, ссылаться на использование is как "использование отражения" в лучшем случае вводит в заблуждение. Так вводит в заблуждение, что этот респондент ПРЕДПОЛАГАЕТ, что результат должен быть медленным. Вы действительно тест это предположение? Нет.)

ToolmakerSteve 21.08.2014 02:01

Мне больше нравится «is System.DBNull», потому что мне не нравится идея сравнивать что-то с NULL и иметь его истинное значение. Многие другие синтаксисы (что, черт возьми, это множественное число?) Имели бы что-нибудь == NULL, возвращающее NULL.

Я понимаю, что DBNull.Value не зря. Я знаю. Я перечисляю свои ПРЕДПОЧТЕНИЯ :)

Хм? Это вопрос .Net. x == null НЕ возвращает null. Выполняя поиск в Google, я не нашел другого языка, на котором он работает. Возможно, вы думаете об операциях с плавающей запятой, когда x == undefined возвращает undefined. Но это отличается от null. null имеет особое значение, и его действительно можно сравнить с. Для получения дополнительных сведений о том, что означает такое сравнение, и является ли это хорошей идеей, см. stackoverflow.com/questions/3507383/… (А в C++, из которого исходит большая часть синтаксиса C#, часто НЕОБХОДИМО сравнивать с null.)

ToolmakerSteve 21.08.2014 02:12

Привет, @ToolmakerSteve! Парень, это старый вопрос, который ты задаешь. Это связано с данными, и в SQL сравнение (somevar = null) возвращает null.

nathaniel 15.10.2014 23:19

Я обычно использую

if (DBNull.Value.Equals(value)) {
    //
}

или же

if (Convert.IsDBNull(value)) {
    //
}

is не использует отражение, как говорит Kevlar623. Он соответствует операции isinst в IL. На этом уровне сравнивать характеристики совершенно глупо, если только вы не работаете над системой наведения ракеты.

Пользуюсь value is DBNull. Звучит правильно, и как разработчик-параноик я не могу поверить, что единственная ценность, когда-либо существовавшая, - это DBNull.Value. Ошибки случаются.

Я бы больше беспокоился о других ошибках, чем о том, будет ли у закрытого системного класса с единственным значением Value каким-то образом появиться второе значение. Однако я согласен с вами не потому, что я параноик, а потому, что тест на DBNull.Value, на мой взгляд, предполагает возможность наличия может быть какого-то другого DBNull. У меня знать нет, но зачем писать код, который звучит так, как будто он ссылается на конкретный DBNull, если на самом деле он только один? Мне всегда казалось глупым.

ToolmakerSteve 21.08.2014 02:24

Это хороший пример того, как форма следует за функцией. Какой из них работает эффективнее - лучший способ. Как он выглядит, как читается или как он вас называет, не имеет значения. Используйте язык эффективно, не превращайте язык в новый.

-1 - Это не ответ. Если бы вы включили какие-либо доказательства того, что форма который была быстрее, тогда это был бы ответ.

ToolmakerSteve 21.08.2014 02:07

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