Я был удивлен, увидев пример того, как строка инициализируется в null, а затем к ней что-то добавляется в производственной среде. Это просто пахло неправильно.
Я был уверен, что это привело бы к исключению объекта null, но этот значительно сокращенный пример также работает:
string sample = null;
sample += "test";
// sample equals "test"
*Обратите внимание, что оригинальный код, который я нашел, устанавливает свойство строки в null и добавляет к нему что-то в другом месте, так что ответы, связанные с оптимизацией компилятора для удаления null во время компиляции, не имеют значения.
Кто-нибудь может объяснить, почему это работает без ошибок?
Основываясь на ответе Leppie, я использовал Reflector, чтобы посмотреть, что находится внутри string.Concat. Теперь действительно очевидно, почему происходит преобразование (никакой магии):
public static string Concat(string str0, string str1)
{
if (IsNullOrEmpty(str0))
{
if (IsNullOrEmpty(str1))
{
return Empty;
}
return str1;
}
if (IsNullOrEmpty(str1))
{
return str0;
}
int length = str0.Length;
string dest = FastAllocateString(length + str1.Length);
FillStringChecked(dest, 0, str0);
FillStringChecked(dest, length, str1);
return dest;
}
**Примечание: конкретная реализация, которую я исследовал (в библиотеке .Net от Microsoft), не преобразует пустые строки, как это предлагается стандартами C# и большинством ответов, а использует несколько тестов для сокращения процесса. Конечный результат такой же, как если бы это было так, но вот так :)