Я не совсем согласен с этим.
Обнуляемые типы в .NET позволяют
рассматриваемая переменная на самом деле
ноль. DBNull это способ сказать "в
другая среда, это значение было
считается нулевым ". Так как нам нужно
способ сделать различие между
фактически нуль - или "нативно" ноль, как
в родной для нашего текущего времени выполнения - и
ноль в другой системе мы общаемся
с обнуляемыми типами и DBNull служат
совершенно разные цели.
Это различие требуется только в том случае, если вы не знаете, была ли ваша локальная переменная уже получена из базы данных. Если вы знаете, что переменная была выбрана из базы данных, было бы хорошо определить ноль и DBNull.
Но разница в том, что null в языках программирования сигнализирует об отсутствии значения, а null == null - это истина. В базах данных ноль указывает на нечто большее, чем неизвестное значение. Поэтому null == null является ложным в базах данных; null вообще ничего не значит, потому что вы не можете определить неизвестное значение, если оно равно другому неизвестному значению. Я не уверен, что DBNull реализован таким образом, а DBNull.Value == DBNull.Value оценивается как ложное.
EDIT
Я только что проверил это, и DBNull не ведет себя должным образом. DBNull.Value == DBNull.Value оценивается как true, но должно давать false с семантикой базы данных null.