【问题标题】:Why is adding null to a string legal?为什么在字符串中添加 null 是合法的?
【发布时间】:2009-03-12 03:58:46
【问题描述】:

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

【问题讨论】:

    标签: c# language-design


    【解决方案1】:

    来自MSDN

    在字符串连接操作中, C# 编译器处理空字符串 与空字符串相同,但它 不转换的值 原始空字符串。

    更多信息请关注+ binary operator

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

    如果一个 字符串连接的操作数是 null,则替换为空字符串。 否则,任何非字符串参数都是 转换为它的字符串表示 通过调用虚拟 ToString 方法继承自类型对象。

    如果 ToString 返回 null,一个空字符串 被替换了。

    【讨论】:

    • 问题最终是关于语言设计的基本原理。有些人试图在其他答案中做出猜测。我们需要 MS 的人来这里回答。
    • C# 团队的绝佳选择,因为它与 C# 6 空条件运算符一起工作就像一个魅力,尤其是在与 C# 6 字符串插值功能结合使用时:例如return $"{person?.FirstName} {person?.LastName}"
    【解决方案2】:

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

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

    如果其他值类型运算符使用 default() 字符串运算符将 null 转换为 "" 的方式,您的解释将是有道理的。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        (很好!我一直认为与 null 连接会出现异常!)

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 这就是它的作用,而不是为什么它这样做。
          猜你喜欢
          • 1970-01-01
          • 2011-12-07
          • 1970-01-01
          • 2020-04-30
          • 2020-11-25
          • 2011-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多