为什么在字符串合法中添加null?

时间:2009-03-12 03:58:46

标签: c# language-design

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吗?

5 个答案:

答案 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引用,当串联字符串时,空值将替换为空字符串。