为什么将null添加到string合法?

关于string基础的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 

为什么不与空连接抛出空引用exception? 是否让程序员的生活更轻松,这样他们就不必在连接之前检查null了?

来自MSDN :

在string连接操作中,C#编译器将空string视为空string,但不转换原始空string的值。

有关+二元运算符的更多信息:

当一个或两个操作数是stringtypes时,二元+运算符执行string连接。

如果string连接的操作数为空,则replace空string。 否则,通过调用从objecttypesinheritance的虚拟ToString方法,将任何非string参数转换为其string表示forms。

如果ToString返回null,则replace空string。

我同意概念上的string就是价值。 但是,请考虑以下代码:

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

如果其他值types运算符使用default()方式的string运算符将null转换为“”,您的解释将是有道理的。

为了方便起见,string运算符是一个快捷方式(特殊情况)是最简单的。

从概念上讲,string通常被认为是值,而不是引用具有标识的对象。 他们不具有值语义struct的主要原因之一是因为赋值复制带来的开销。 如果string值,则它们不能为空,所以null值仅由“+”运算符处理,就好像它是一个空string(即,就像default(string) == ""一样default(int) == 0 )。

我猜想,语言(或标准库)devise者认为这将是一个普通的情况,他们会给程序员一个忙。

(整洁!我总是认为只能通过一个exception与空值相结合)

它不抛出空引用exception的原因是因为你实际上并没有试图访问空对象上的任何属性或方法。 如CMS引用,当连接string时,空值被replace为空string。