String.Concat、string.format和+之间有什么区别?

7

什么是它们之间的区别:

  • String.Concat,
  • String.Format,
  • + 运算符.

在任何情况下,长字符串或短字符串连接时哪个更有效率。

注意:保留HTML标记。
1个回答

14

string.Concat仅仅是将字符串连接在一起,没有除了调用ToString之外的任何转换或格式化功能。

string.Format则更加丰富,允许使用格式模式等功能。

当您在C#源代码中使用+运算符时,编译器会将其转换为对String.Concat的调用 - 它不像decimal中的运算符一样在执行时进行运算。

所以这个:

string result = x + y + z;

被编译成了这个:

string result = string.Concat(x, y, z);

在效率方面,显然调用 string.Concat 和使用 + 可以等价。通常情况下,我会认为这比 string.Format 更快,但在大多数情况下差异可以忽略不计。你应该首先编写最清晰、最易于维护的代码(通常意味着使用 string.Format),然后只有在有测试数据表明需要优化特定部分时才进行微观优化,而且只有在证明它有帮助时才保留优化。

请注意,在一个循环中 重复 连接字符串是一个可以做出一些优化的领域。这段代码非常低效:

string result = "";
foreach (var x in y)
{
    // Do some processing...
    string z = ...;
    result += z;
}

这将导致在每次迭代中都要复制一个中间字符串。在这种情况下,要么使用 StringBuilder,要么使用一个 LINQ 查询来表示您最终需要连接的项,然后使用 string.Joinstring.Concat 来执行连接操作。


值得一提的是,性能差异(尽管可能可以忽略,正如Jon所指出的那样)是因为在底层,String.Format实例化了一个StringBuilder来完成工作,而String.Concat(以及+,据推测)则使用了内存中的unsafe字符串操作。 - Owen Blacker
@OwenBlacker:我不想假设是因为那个原因。从根本上讲,它正在做更多的工作——例如,必须解析格式字符串。 - Jon Skeet
@JonSkeet:确实,我会期望解析是不同之处。当我第一次想要通过Reflector运行mscorlib时,我仅仅发现了底层的差异很有趣,所以认为其他SO用户可能也会同样感到好奇 :o) - Owen Blacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接