【问题标题】:Are there benefits to using string formatting versus string concatenation? [duplicate]使用字符串格式与字符串连接有什么好处吗? [复制]
【发布时间】:2011-01-25 22:18:20
【问题描述】:

可能重复:
C# String output: format or concat?

使用这个有什么好处:

Console.WriteLine("{0}: {1}", e.Code, e.Reason);

VS。这个:

Console.WriteLine(e.Code + ": " + e.Reason);

??????

【问题讨论】:

  • 您可能想查看反汇编代码,看看是否存在显着的性能差异。我个人更喜欢第一个。
  • 我一直对那些发现格式说明符比简单连接更易读的人感到震惊。不要告诉我你从来没有打错那些,因此不得不回去纠正一个错误。另请参阅this blog entry。事实证明,简单连接 (+) 最适合连接(相当小的集合),StringBuilder 最适合在需要构建循环时,Format 最适合格式化。使用Format 优于+ 的性能优势充其量可以忽略不计

标签: c# string string-formatting string-concatenation


【解决方案1】:

我总是使用 .Format() 的原因是为了可读性,从而减少错误和维护好处。当然,如果您对代码比较陌生,这毫无意义,因为第二个示例一开始更直观。第一个看起来不必要的复杂。

但是,如果您选择第二种模式,那么当您有很多变量时,您就会遇到问题。这是更容易理解第一种模式的好处的地方。

例如

Console.Writeline(var1 + " " + var2 + "-" + var3 +
 " some sort of additional text" + var4);

注意这个错误:我需要在“文本”之后有一个空格,但在这个例子中并不容易看到。

但是,如果我这样做:

Console.Writeline("{0} {1}-{2} some sort of additional text{3}", 
 var1, var2, var3, var4)

更清楚地看到发生了什么。当您将格式与将要使用的变量分开时,更容易欣赏最终结果。

如果我们想更长远地考虑,那么它有助于全球化/定制化。如果我们将这些格式字符串放入配置中,我们就可以在不接触代码的情况下更改变量的格式或顺序。

【讨论】:

    【解决方案2】:

    对我来说,string.Format 吊坠的好处是:

    • 提高了可读性
    • 更好的可翻译性

    从性能的角度来看,我从未做过任何测量;很可能连接比string.Format 挂件更快。

    【讨论】:

      【解决方案3】:

      实际上,唯一的区别是第一个允许您控制布局

      string.Format("*{0:3}*",1); // *  1*
      

      或控制格式:

      string.Format("*{0:c}*",1); // *$1.00*
      

      在紧密循环中执行大量连接时可以考虑连接的性能,在这种情况下StringBuilder.AppendStringBuilder.AppendFormat 都是首选。 AppendFormat 和 string.Format 在性能方面非常接近,因此无需用第二个代替第一个。

      【讨论】:

      • 布局可以通过大量的 ToString 重载来完成,通常接受一个模式
      • @Marc 但是以他的例子为例.....
      【解决方案4】:

      归结为“何时使用 String.Format 与字符串连接更好”。

      请参阅此问题以获取答案: When is it better to use String.Format vs string concatenation?

      【讨论】:

        【解决方案5】:

        由于字符串是不可变的(不能更改现有字符串,必须每次都创建一个新字符串)字符串格式可以带来性能优势,因为它不会创建尽可能多的内存引用。

        result = string1 + " " + string2 + " " + string3

        这会创建 10 个引用

        • 结果
        • 字符串1
        • 字符串2
        • 字符串3
        • " "
        • " "
        • 字符串1 + " "
        • string1 + " " + string2
        • string1 + " " + string2 + " "
        • string1 + " " + string2 + " " + string 3

        result = string.Format("{0} {1} {2}", string1, string2, string3)

        这会创建 5 个引用

        • 结果
        • 字符串1
        • 字符串2
        • 字符串3
        • “{0} {1} {2}”

        【讨论】:

        • 第一个根本不正确;这是对 string.Concat 的一次调用,它测量所有字符串,预先分配正确的空间,并将它们复制进去。没有中间字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 2014-07-12
        相关资源
        最近更新 更多