String Basics上的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吗?
答案 0 :(得分:56)
来自MSDN:
在字符串连接操作中, C#编译器处理空字符串 与空字符串相同,但它 不转换的价值 原始的空字符串。
有关+ binary operator的更多信息:
binary +运算符执行字符串 当一个或两个连接时 操作数是字符串类型。
如果是 字符串连接的操作数是 null,替换空字符串。 否则,任何非字符串参数都是 转换为其字符串表示形式 通过调用虚拟ToString 从类型对象继承的方法。
如果 ToString返回null,一个空字符串 被替代。
答案 1 :(得分:6)
我同意概念上的字符串只是值。但是,请考虑以下代码:
int? i = null;
i += 1; // The result of this is that i == null
如果其他值类型运算符使用default()字符串运算符将null转换为“”的方式,那么您的解释是有意义的。
为方便起见,最简单的说字符串运算符是一种快捷方式(特殊情况)。
答案 2 :(得分:3)
从概念上讲,字符串通常被认为是值,而不是对具有标识的对象的引用。它们不具有值语义struct
的主要原因之一是由于复制赋值所带来的开销。如果字符串是值,则它们无法为空,因此null
只是被“+”运算符视为空字符串(即,就像{{1}一样就像default(string) == ""
)一样。
答案 3 :(得分:1)
我想语言(或标准库)设计师认为这将是一个足够普遍的案例,他们会帮助程序员。
(整洁!我总是假设通过异常与null结合!)
答案 4 :(得分:0)
它不抛出空引用异常的原因是因为您实际上并没有尝试访问null对象上的任何属性或方法。作为CMS引用,当串联字符串时,空值将替换为空字符串。