Я был удивлен, увидев пример строки, инициализированной нулем, а затем добавив к ней что-то в производственной среде. Он просто плакал неправильно.
Я был уверен, что это вызвало бы исключение из нулевого объекта, но этот очень сокращенный пример также работает:
string sample = null;
sample += "test";
// sample equals "test"
* Обратите внимание, что исходный код, который я нашел, устанавливает свойство string в null и добавляется к нему в другом месте, поэтому ответы, связанные с компилятором, оптимизирующим нуль во время компиляции, не имеют значения.
Может кто-нибудь объяснить, почему это работает без ошибок?
Последующий:
На основании ответа Leppie я использовал Reflector, чтобы увидеть, что внутри строки. 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), не преобразуется в пустые строки, как это предлагается стандартами С# и большинством ответов, но использует несколько тестов для сокращения процесса, Конечный результат такой же, как если бы он был, но там вы идете:)