DBNull Митча, не являющийся нулем, является хорошим пунктом. Также остерегайтесь этого, который является законным C #, но (к счастью) выдаст предупреждение:
int x = 0;
// Much later
if (x == null)
Похоже, что это должно быть недопустимо, но это допустимо, потому что x может быть неявно преобразован в обнуляемое int. Никогда не игнорируйте это предупреждение.
Вы также должны знать о том, что на поверхности кажется странным с операторами. Например, обычно вы ожидаете, что:
if (x <= y || x >= y)
будет всегда верным - но это не так, когда x
и y
оба null
. Тем не менее, x == y
будет верным - в отличие от SQL и даже в отличие от VB! Поведение отмененного оператора обеспечивается языком, а не средой выполнения, поэтому вам необходимо знать, что будет делать каждый используемый вами язык.
Наконец, убедитесь, что вы понимаете, как бокс работает с обнуляемыми типами. Непустое значение типа значения, допускающего значение NULL, помечается в штучной упаковке, как если бы оно было необнуляемым для начала, а значение NULL упаковывается в простую нулевую ссылку. (т. е. окно на самом деле не создано - среда выполнения просто возвращает ноль). Вы можете распаковать в тип значения Nullable либо из пустой ссылки, либо из поля базового типа. Имеет ли это смысл? (Я углубляюсь в это в C # in Depth, и, надеюсь, с большей ясностью ... но сейчас 8.45, а у меня не было кофе ...)
РЕДАКТИРОВАТЬ: Хорошо, может быть, пример поможет:
int? i = 5;
int? j = null;
object x = i; // x = reference to boxed int (there's no such thing as a "boxed nullable int")
object y = j; // y = null (a simple null reference)
i = (int?) x; // Unboxing from boxed int to int? is fine.
j = (int?) y; // Unboxing from a null reference to int? is fine too.