Подтвердить что ты не робот

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

В статье MSDN на String Basics показано следующее:

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 перед конкатенацией?

4b9b3361

Ответ 1

От MSDN:

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

Дополнительная информация о + двоичный оператор:

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

(Neat! Я всегда считал, что конкатенация с нулевым значением будет вызвана исключением!)

Ответ 5

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