Почему добавление null в строку является законным?


статья MSDN о Строка Основы показывает это:

string str = "hello";
string nullStr = null;
string emptyStr = "";

string tempStr = str + nullStr; // tempStr = "hello"
bool b = (emptyStr == nullStr);// b = false;
string newStr = emptyStr + nullStr; // creates a new empty string
int len = nullStr.Length; // throws NullReferenceException

почему конкатенация с null не вызывает исключение null reference? Это делает жизнь программиста проще, так что им не нужно проверять null перед конкатенацией?

5 58

5 ответов:

с MSDN:

в операциях конкатенации строк, компилятор C# обрабатывает пустую строку то же самое, что и пустая строка, но это не преобразует значение исходная нулевая строка.

подробнее о + бинарный оператор:

оператор binary + выполняет строку конкатенация, когда один или оба операнды имеют тип string.

Если операнд конкатенация строк null, подставляется пустая строка. В противном случае любой нестроковый аргумент является преобразуется в его строковое представление путем вызова виртуального метода toString метод наследуется от типа объекта.

Если ToString возвращает null, пустую строку подставляется.

Я согласен, что концептуально строки-это просто значения. Однако рассмотрим следующий код:

int? i = null;
i += 1; // The result of this is that i == null

если другие операторы типа значения использовали default () так, как строковые операторы преобразуют null в"", ваше объяснение будет иметь смысл.

проще всего сказать, что строковые операторы являются ярлыком (специальным случаем) для удобства.

концептуально строки обычно рассматриваются как значения, а не ссылки на объекты, которые имеют идентичность. Одна из главных причин, что они не structS с семантикой значений связано с накладными расходами, которые возникают при копировании по назначению. Если строки были значения они не могут быть обнулены и поэтому null просто обрабатывается оператором"+", как если бы это была пустая строка (т. е., как если бы default(string) == "" как default(int) == 0).

Я думаю, что дизайнеры языка (или стандартной библиотеки) решили, что это будет достаточно распространенный случай, что они сделают программистам одолжение.

(аккуратно! Я всегда просто предполагал, что concating с null будет через исключение!)

причина, по которой он не создает исключение null reference, заключается в том, что вы фактически не пытаетесь получить доступ к каким-либо свойствам или методам для объекта null. Как кавычки CMS, при конкатенации строки нули заменяются пустыми строками.