【问题标题】:String - " " + vs " " {} [duplicate]字符串-“”+ vs“”{} [重复]
【发布时间】:2014-07-07 21:33:53
【问题描述】:

写下面两个有区别吗?代码用于 C#

String S1 = "The " + Item.Name + " is made of " + Item.Property + " and is at " + Item.Durability + "% durability."

反对

String S2 = "The {0} is made of {1} and is at {2} % durability.", Item.Name, Item.Property, Item.Durability

?假设该项目以字符串形式填充,例如,Axe 的名称、Steel 的属性和 50 的耐久度。

【问题讨论】:

  • 我认为那里应该有一个string.Format

标签: c# string


【解决方案1】:

第二个更快,假设您正确使用String.Format

在第一种方法中,您在内部强制系统按顺序构建一个逐渐增大的字符串,从而为每个 + 操作触发至少完整分配和内部复制。

在第二种情况下,您让内部优化的函数首先评估所有参数,然后一次性分配一个字符串来包含整个最终结果,然后将其复制进去。

【讨论】:

  • 不行,应该优化成String.Concat
  • 感谢两位的投入。我已经使用 + 和 += 有一段时间了,我知道 += 创建了一个新的字符串实例,但不知道 "A " + b + " C " + d 会在每个 + 上创建新实例。我将查找 concat 并尝试使用 string.format 将我的样式切换为 {0}(我不知道所有 {0} 操作都需要/建议使用它。)
  • @Charles:它不会在每个+ 上创建一个新实例。像这样的多重连接(不在循环中)被优化为String.Concat。循环中的多个连接应使用StringBuilder 完成。
  • @false 正确,但这是假设编译器聪明。我认为编译器不应该在规范中这样做。考虑到 MS 编写了唯一严肃的编译器,当然相对没有实际意义,但仍然:)
【解决方案2】:

是的,第二个给你一个字符串,因为你的代码磨损了,你必须使用string.Format方法,所以它比第一个有更好的性能。

String S2 = string.Format("The {0} is made of {1} and is at {2} % durability.", Item.Name, Item.Property, Item.Durability);

第一个会生成很多字符串,并在+运算符之间做串联操作。

如果循环内有串联,建议使用StringBuilder 类。

看看这个帖子:Most efficient way to concatenate strings?

【讨论】:

    【解决方案3】:

    假设您更正第二个示例以使用 String.Format,它们应该会产生完全相同的结果,是的。

    我个人更喜欢使用String.Format,因为它给了我更多的控制权。此外,我一直认为它可能更有效,尽管我没有进行任何测试来验证这一点。

    【讨论】:

    • 别忘了它会为您调用 ToString(),以便自动完成到字符串的转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多