I am always confused with the different ways of expressing nulls. There is the null reference type (aka "null"). Then I've seen that throughout my application, developers have used MinValue to represent nulls. Ex: Double.MinValue or DateTime.MinValue except for a String for which they use "null"
Then there is System.DBNull (and System.DBNull.Value - not sure what to use when). To add to the confusion, there are also System.Nullable
and System.Nullable<T>
namespaces.
Can someone help me clear this null confusion?
Thanks
Sure.
System.DBNull
is a class that was (and still is) used by ADO.NET to represent a null
value in a database.
null
is actually a null
reference, and in your application code any reference type should use null
as its, well, null
value.
The usage of MinValue
for various primitive types (which, since they are value types cannot be assigned null
) dates back to the dark days before C# 2.0, which introduced generics. Now the preferred method for representing a nullable primitive type is to use the Nullable<T>
generic type, usually represented in shorthand with a question mark after the primitive type. For example, I could declare a nullable int
variable named foo
in C# as:
Nullable<int> foo;
or
int? foo;
Both are identical.
null
is only valid for reference types: types that are a class
rather than a structure
.type.MinValue
, but might be something (consider Boolean, for example). Nullable<T>
is for when you have a value type that might genuinely be null. The default value (maybe MinValue) is also valid and you need to distinguish it from when the variable has not been assigned yet. In C#, you can use a ? with a value type as a short hand notation (for example: int?
), but you're still creating the same Nullable<T>
.DBNull
specifically refers to NULL values from a database. It's not the same thing as using null elsewhere in the language: it's only for talking to a database so you can know when a query returned a null value.default(T)
construct used, where T is a type parameter. This allows you to set a type's default value without knowing whether that type is a reference type or a value type, much less what a specific value type's default value might be.A Null
value represents any reference type object that has not had its memory allocated yet.
The MinValue
does not represent a Null
, rather it is a property that is often used to represent the smallest possible constant value that a given value type can have.
The DBNull.Value
class is a mapping of the Nulls returned/passed to a database.
The Nullable generic type enables you to assign Null values to a Value-type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With