Почему добавление 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 ответов:
с MSDN:
в операциях конкатенации строк, компилятор C# обрабатывает пустую строку то же самое, что и пустая строка, но это не преобразует значение исходная нулевая строка.
подробнее о + бинарный оператор:
оператор binary + выполняет строку конкатенация, когда один или оба операнды имеют тип string.
Если операнд конкатенация строк null, подставляется пустая строка. В противном случае любой нестроковый аргумент является преобразуется в его строковое представление путем вызова виртуального метода toString метод наследуется от типа объекта.
Если ToString возвращает null, пустую строку подставляется.
Я согласен, что концептуально строки-это просто значения. Однако рассмотрим следующий код:
int? i = null; i += 1; // The result of this is that i == null
если другие операторы типа значения использовали default () так, как строковые операторы преобразуют null в"", ваше объяснение будет иметь смысл.
проще всего сказать, что строковые операторы являются ярлыком (специальным случаем) для удобства.
концептуально строки обычно рассматриваются как значения, а не ссылки на объекты, которые имеют идентичность. Одна из главных причин, что они не
struct
S с семантикой значений связано с накладными расходами, которые возникают при копировании по назначению. Если строки были значения они не могут быть обнулены и поэтомуnull
просто обрабатывается оператором"+", как если бы это была пустая строка (т. е., как если быdefault(string) == ""
какdefault(int) == 0
).