【问题标题】:Coalesce vs empty string concatenation合并与空字符串连接
【发布时间】:2010-09-29 19:27:00
【问题描述】:

我的同事是 C# 新手,不知道 coalesce 运算符。于是,我看到他写了这样一行代码:

string foo = "" + str;

如果 str 为空,这个表达式将返回一个空字符串。当然,也可以改写成这样:

string foo = str ?? "";

而且我觉得这会更具可读性。但这真的有那么大吗?可读性的好处是否足以建议返回并使这些行看起来像第二行?或者这是我应该学会放手的事情之一(前提是我的同事受过教育,了解未来做这件事的最佳方式)?

编辑:请注意,我很欣赏效率 cmets,但这并没有真正用于任何性能至关重要的情况。因此,虽然这些信息很有趣,但不一定是我认为重要的信息。

【问题讨论】:

    标签: c# string concatenation coalesce


    【解决方案1】:

    我会使用合并运算符或 foo = str == null ? "" : str; 有两个原因:

    1. 第一个示例在其他花括号语言(尤其是 Java 和 JavaScript)中没有相同的行为,其中将空引用附加到空字符串会生成包含文本 null 的字符串。因此,第一个示例需要更多的脑力劳动来确保它会在所编写的语言中产生正确的行为。即使有其他线索,它是 C#(例如小写类型 string),任何需要开发人员放慢速度并思考“这段代码的意图是什么”的东西都会导致生产力下降。当从一种语言迁移到另一种语言时,它还可能引入错误。

    2. 第二个例子更清楚地表达了代码的意图,如原题所述:

      when str is null set foo to an empty string

      与第一个例子相反,可以读作:

      set foo to an empty string with str appended (which may have the side effect of setting foo to an empty string when str is null)

    作为程序员,我们可能应该尝试表达我们代码的意图,而不是依赖其他操作的副作用来给我们想要的结果。

    【讨论】:

      【解决方案2】:

      IMO,最好明确定义这样的逻辑,即不要使用字符串连接来避免空字符串并使用条件语句或 ??运算符。

      关于其他cmets:

      还有一个性能优势 使用空合并运算符, 因为不需要进行连接 (因此,没有额外的字符串 正在创建实例 不必要的)

      不正确。 C# 编译器将 "" + string2 编译为与 string1 100% 相同的代码?? “”。此外,C# 编译器将 + 运算符转换为对 string.Concat 方法的调用,该方法又使用 string.IsNullOrEmpty 函数检查参数,并且在这种情况下不分配新字符串。

      我还建议使用 String.Empty over "" 因为它是 恒定的,不需要 创建一个新的字符串

      .NET框架支持string interning所以""和string.Empty指向同一个内存区域

      【讨论】:

        【解决方案3】:

        我更喜欢您的第二个示例而不是第一个示例,因为它更主动地防止 str 为空并且更具表现力。 我还建议使用String.Empty 而不是"",因为它是一个常量,不需要创建新的String(是的,这是一个极端的挑剔,但需要注意)。删除>

        【讨论】:

        • "" 与 String.Empty 从 .NET 2.0 开始(.NET FW 支持字符串实习)相同,即不会创建字符串类的新实例
        • String.Empty 更具可读性,看起来不像有人忘记输入内容。
        • 我同意 - 我绝对更喜欢 String.Empty 的 外观,但 aku 100% 正确地指出没有性能优势。
        • 我更喜欢 "" 因为它更短。另外,我读到一些关于 String.Empty 是只读的,并导致在运行时而不是编译时发生一些连接。
        【解决方案4】:

        虽然从技术角度我更喜欢第二行,但实际上第一行对我来说更具可读性...

        【讨论】:

          【解决方案5】:

          我个人认为没有一个比另一个更具可读性。我更喜欢这个:

          string foo = str ?? "";
          

          只是因为我真的很喜欢 ??运算符。

          如果你是个新手,我觉得这样会更容易理解:

          string foo = str == null ? "" : str;
          

          string foo = "";
          if (str != null) foo = str;
          

          但是,您需要问自己,“您真的想做到多简单?”

          【讨论】:

            【解决方案6】:

            第二行对我来说更具可读性,它清楚地表明了右侧表达式的意图。

            【讨论】:

              猜你喜欢
              • 2015-01-13
              • 2015-04-26
              • 1970-01-01
              • 2011-12-06
              • 2013-06-16
              • 2014-10-25
              • 2011-01-26
              相关资源
              最近更新 更多