Christian Liensberger - MSP
Well NULL (Nothing, null, nil) is just a pointer to the 0 address. That's how it went originally. an empty string is "", which is a string that consists only of \0. A null string is when the reference of the string variable points to null. For example "".Trim() works on the empty string. which doesn't work if the variable is set to null.
String is a reference type in .NET - not a struct like for example Int32 (int), Int16 (short), Int64 (long). Structs are value types - they inherit from ValueType. They can't be null, because they are managed on the stack. String, as it is a reference type, is managed on the heap and can be null. By default all reference types are initialized with NULL. That's why string is initalized with NULL.
If you want your strings to be initialized with "" you need to do it by hand.
string foo = string.Empty; // or string foo = "";
Although it's better to have it initialized with null. That uses less memory and it's easier to check if a string has been initialized already. Makes algorithms easier.
EDIT: DBNull.Value is a special value that is understood by the ADO.NET providers to conver them to the database null value. Each database has an own value (internally) that represents null. The ADO.NET provider takes care for you to convert DBNull.Value to the database null. It is converted to the actual database NULL for you and converted back, once you load a record from database.