为什么在C#中使用String.Concat()?

我一直在想这个问题。 为什么使用String.Concat()而不是使用plus运算符。 我理解String.Format,因为它使用plus运算符空洞并使您的代码看起来更好。

比如说

string one = "bob"; string two = "jim"; string three = one + two; string three = String.Concat(one,two); 

只要两个操作数是字符串,使用+运算符和String.Concat方法之间就没有任何区别。 使用+运算符的代码实际上编译成String.Concat调用。

使用最符合您意图的代码。

当我知道要连接多少个字符串时我使用+ – 但是如果你只有一个数组怎么办? 在这种情况下,你不知道应用+多少次,所以你必须调用一个方法(或者自己循环,这很糟糕)。

我不记得经常调用string.Concat – 这是一个非常罕见的。

正如guffa所说, +编译string.Concat调用无论如何 – 值得注意的是string实际上没有 +运算符,如果你试图在reflection中使用它,这可能会引起混淆!

+一个好处是,如果所有参数都是常量表达式,编译器将为您执行连接,因此您不需要在执行时执行此操作。 在大多数代码中,这种微小的性能优势并不重要,但是当我发现最易读的代码具有性能优势时,它总是很好的:)

我自己也有同样的问题,这个问题引发了我对它的调查,

我创建了以下类

 public class Class1 { string str = "One" + "Team"; string str2 = string.Concat("One", "Team"); } 

以下是相应的IL代码。

 .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 40 (0x28) .maxstack 8 IL_0000: ldarg.0 IL_0001: ldstr "OneTeam" IL_0006: stfld string StringConcat.Class1::str IL_000b: ldarg.0 IL_000c: ldstr "One" IL_0011: ldstr "Team" IL_0016: call string [mscorlib]System.String::Concat(string, string) IL_001b: stfld string StringConcat.Class1::str2 IL_0020: ldarg.0 IL_0021: call instance void [mscorlib]System.Object::.ctor() IL_0026: nop IL_0027: ret // end of method Class1::.ctor } 

对我来说它肯定看起来像string.Concat比重载+运算符有更多的步骤。 但我确实在System.String类中知道,对于重载+运算符也会发生类似的操作集。 思考?

因为你可以使用带有两个对象的版本;)

便携性(你的)。

在其他语言中,当呈现两个字符串时,+可能不会像您期望的那样连接。 它可能会完全出乎意料。 或者,在某些松散类型的语言中,如果在整数或数字标量变量与字符串之间使用+,则可能不会抛出编译器警告,尝试将串行转换为数字,然后添加它们。

相比之下,.concat()在某些情况下与+相比非常明显和可读。

+运算符是一个数学运算符。 因此,在使用该运算符连接字符串之前,编译器必须决定是将其用作数学运算符以进行添加还是将其用于字符串连接。

例如:如果你连接a + b + c + d + e + f,编译器将做出5次运算的决定5次。

Performancewise不推荐。

但是,如果你只有一个连接,我不认为使用+或Concat()方法在性能方面有很大差异

老实说; 有些人喜欢它。 我知道我宁愿使用Concat,因为+真的不是很直观。 特别是只是深入研究代码; 很难说这些是你正在添加的数字还是两个字符串你的结尾或两个你正在做矢量加法的点。 🙂

我相信它与字符串a + string b相同。 C#中的字符串类型是不可变的,因此字符串操作的首选方法是通过StringBuilder。 正如Guffa总结的那样:“用代码最能代表你的意图。” 当然,对于简单的使用,性能不是太大的问题使用+或concat。