Как работает добавление к нулевой строке в C#?

Я был удивлен, увидев пример того, как строка инициализируется в 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# и большинством ответов, а использует несколько тестов для сокращения процесса. Конечный результат такой же, как если бы это было так, но вот так :)

45
задан Gone Coding 3 November 2011 в 09:20
поделиться