Question: 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

Answer: 
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.
"`MinValue`"s were used with value types before nullable types came around in C# 2.0. So there is a lot of legacy code which uses the old style of knowing when a value type doesn't have a value. Nowadays it's much easier to use a `DateTime? date = null` than `DateTime date = DateTime.MinValue`. As far as DBNull goes, that is something that is required as an abstraction layer to databases, but you can avoid having to deal with it yourself by employing an ORM such as NHibernate or some such - you pretty much, from a app. development standpoint will only have to deal with built-in C# types.