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