65

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

4

5 回答 5

60

来自MSDN

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

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

当一个或两个操作数都是字符串类型时,二元 + 运算符执行字符串连接。

如果字符串连接的操作数为 null,则替换为空字符串。否则,通过调用从类型 object 继承的虚拟 ToString 方法,将任何非字符串参数转换为其字符串表示形式。

如果 ToString 返回 null,则替换为空字符串。

于 2009-03-12T04:04:49.147 回答
6

我同意从概念上讲字符串只是值。但是,请考虑以下代码:

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

如果其他值类型运算符使用 default() 字符串运算符将 null 转换为“”的方式,那么您的解释将是有意义的。

为了方便起见,最简单的说法是字符串运算符是一种快捷方式(特殊情况)。

于 2009-04-28T18:17:39.110 回答
3

从概念上讲,字符串通常被认为是值,而不是对具有标识的对象的引用。它们不struct具有值语义的主要原因之一是分配时复制带来的开销。如果字符串值,则它们不能为空,因此null“+”运算符仅将 a 视为空字符串(即,default(string) == ""就像 一样default(int) == 0)。

于 2009-03-12T04:31:42.047 回答
1

我猜语言(或标准库)设计者认为这将是一个足够常见的案例,他们会帮程序员一个忙。

(整洁!我总是假设与 null 连接会通过异常!)

于 2009-03-12T04:08:47.653 回答
0

它不抛出空引用异常的原因是因为您实际上并没有尝试访问空对象上的任何属性或方法。作为 CMS 引号,在连接字符串时,将空字符串替换为空字符串。

于 2009-03-12T04:08:13.007 回答