Почему добавление null в строку допустимо? - PullRequest
60 голосов
/ 12 марта 2009

В статье 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

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

Ответы [ 5 ]

56 голосов
/ 12 марта 2009

С MSDN :

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

Дополнительная информация о бинарном операторе + :

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

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

Если ToString возвращает ноль, пустую строку замещен.

6 голосов
/ 28 апреля 2009

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

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

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

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

3 голосов
/ 12 марта 2009

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

1 голос
/ 12 марта 2009

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

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

0 голосов
/ 12 марта 2009

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

...