IsDBNull и DBNull.Value — это одно и то же?

Изменить. Чтобы было ясно, я не спрашиваю о (Null против DBNull.Value) или (IsDBNull против IsNull).


Ну, я всегда использую IsDBNull() для оценки полей базы данных и проверки, равно ли значение DBNull, но я заметил, что во многих примерах кода люди используют DBNull.Value для той же цели. Вот как:

If IsDBNull(obj) Then DoSomething()      ' ---> My approach
If obj = DBNull.Value Then DoSomething() ' ---> Theirs.

Также в С#:

if (obj == DBNull.Value) {DoSomething();}

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

Эта ссылка MSDN демонстрирует, как DBNull.Value.Equals делает то же самое, что и функция IsDBNull, но никогда не упоминает/не предлагает использовать DBNull.Value для оценки без использования функции Equals.

Итак, мне действительно интересно, есть ли какая-то реальная разница между этими двумя, чтобы один из них рекомендовался другому? Или они делают одно и то же?


person 41686d6564    schedule 16.02.2017    source источник
comment
Во второй строке следует использовать Is, а не =, но, кроме этого, они функционально эквивалентны. Этот метод IsDBNull, вероятно, использует этот второй метод внутри.   -  person jmcilhinney    schedule 16.02.2017
comment
Вот реализация .Net .   -  person Will Ray    schedule 16.02.2017
comment
@WillRay, это реализация метода SqlDataReader.IsDBNull, который не указан в вопросе. Метод в приведенном выше коде — Microsoft.VisualBasic.Information.IsDBNull.   -  person jmcilhinney    schedule 16.02.2017
comment
Одна из причин, по которой я не использую функции vb.net, заключается в том, что в конечном итоге весь код будет написан на С#. И если вы используете Trim(str), он не может быть переведен конвертерами. Но если вы используете str.Trim(), он преобразуется в С#. Чтобы ответить на ваш вопрос, достаточно скачать бесплатный дизассемблер и посмотреть код функции. Но вы действительно не должны беспокоиться о том, что делает IsDbNull, потому что вы должны использовать DBNull.Value.Equals   -  person T.S.    schedule 16.02.2017
comment
Возможный дубликат В чем разница между null и System. DBNull.Value?   -  person Chetan Sanghani    schedule 16.02.2017
comment
@jmcilhinney, как насчет версии C #? Я видел это много раз (например, здесь).   -  person 41686d6564    schedule 16.02.2017
comment
@Т.С. Я уже упоминал в своем вопросе, что и IsDBNull, и DBNull.Value.Equals делают одно и то же. Также некоторые функции VB действительно пригодятся и станут более удобочитаемыми. Microsoft сообщает в приведенной выше ссылке MSDN: Однако этот метод редко используется, поскольку существует ряд других способов оценить поле базы данных на предмет отсутствующих данных. К ним относится функция Visual Basic IsDBNull.... Примечание: я не использую Trim(str), если только это не VB6: D   -  person 41686d6564    schedule 16.02.2017
comment
@ChetanSanghani Вам даже не нужно открывать другой вопрос. Просто взглянув на их оба названия, они явно говорят о двух разных вещах :)   -  person 41686d6564    schedule 16.02.2017
comment
if (obj == DBNull.Value) {DoSomething();} в C# точно эквивалентен If obj Is DBNull.Value Then DoSomething() в VB.   -  person jmcilhinney    schedule 16.02.2017
comment
@jmcilhinney очевидно, вы правы. Я этого не знал, и, думаю, именно поэтому возникла путаница. Спасибо :)   -  person 41686d6564    schedule 16.02.2017


Ответы (1)


Нет, они не одинаковы. DBNull.Value фактически является константой, а IsDBNull — функцией, которая возвращает значение true или false.

IsDbNull — это тестовый флаг, возвращающий логическое значение, и сокращенное выражение для использования в операторах If. Вы ВСЕ ЕЩЕ можете использовать метод Obj = DBNull.value, но IsDbNull является предпочтительным методом в соответствии с MS.

Однако, если вы хотите использовать оператор select case, вам все равно нужно использовать объект DBNull.value.

Select case Obj
    Case DBNull.value
    Case "Whatever"
End Select

Конечно, вам ТАКЖЕ нужен DBNull.Value, если вы хотите установить для поля обратно нулевое значение.

Это похоже на Double.IsNaN и Double.NaN.

person Trevor_G    schedule 16.02.2017
comment
Это не то, что его беспокоит. Он спрашивает, совпадает ли результат сравнения obj isDBNull() с obj == DBNull.value !! Ответ ДА, они одинаковые. - person Jenna Leaf; 13.06.2018