Причина, по которой строка будет иметь значение null, заключается в том, что строка является ссылочным типом, а значение по умолчанию для всех ссылочных типов равно null (т. Е. Нет ссылки).
Лучшая ссылка - Значения по умолчаниюТаблица (помните, что по умолчанию для всех ссылочных типов установлено значение null), но некоторые примеры ниже дают подходящее представление:
string a = default(string); // null
String b = default(String); // null
int c = default(int); // 0
int? d = default(int?); // null
Object e = default(object); // null
double f = default(double); // 0.0
// an instance of someStruct with fields set to default(theirType)
someStruct g = default(someStruct);
Строковый тип представляется типом значения, потому что он выглядит таким примитивным.Кроме того, это означает, что вы никогда не сможете изменить строку, вместо этого вы просто устанавливаете строковые символы, чтобы указывать на новые строковые «значения» (которые сами являются ссылками), создавая впечатление, что строка является типом значения.
Например:
string a = "boo";
/* Mem contains reference to "boo" and symbol 'a' => reference("boo") */
a = "gah";
/* Mem contains references to "boo" and "gah". symbol 'a' -> reference("gah") */
Для получения дополнительной информации о строках см. эту замечательную статью .
И не забудьте Таблицу значений по умолчанию.