我一直在想这个问题。为什么使用String.Concat()而不是使用plus运算符。我理解String.Format,因为它使用了plus运算符,并使你的代码看起来更好。
例如
string one = "bob";
string two = "jim";
string three = one + two;
string three = String.Concat(one,two);
答案 0 :(得分:33)
只要两个操作数是字符串,使用+
运算符和String.Concat
方法之间就没有任何区别。使用+
运算符的代码实际上会编译为String.Concat
调用。
使用最符合您意图的代码。
答案 1 :(得分:14)
当我知道要连接多少个字符串时,我会使用+
- 但是如果你只有一个数组呢?在这种情况下,你不知道应用+
多少次,所以你有来调用一个方法(或者自己循环,这很糟糕)。
我不记得经常打电话给string.Concat
- 这是非常罕见的。
正如guffa所说,+
无论如何编译到string.Concat
的调用 - 值得注意的是string
实际上并没有拥有 a +运算符,如果你试图在反射中使用它,这可能会引起混淆!
+
的一个好处是,如果所有参数都是常量表达式,编译器将为您执行连接,因此您不需要在执行时执行此操作。在大多数代码中,这种微小的性能优势并不重要,但是当我发现最易读的代码 具有性能优势时,它总是很好的:)
答案 2 :(得分:5)
我自己也有同样的问题,这个问题引发了我对它的调查,
我创建了以下类
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
类内部,对于重载+运算符也会发生类似的操作集。思考?
答案 3 :(得分:2)
因为您可以使用带有两个对象的版本;)
答案 4 :(得分:1)
便携性(你的)。
在其他语言中,当呈现两个字符串时,+可能不会像您期望的那样连接。它可能会完全出乎意料。或者,在某些松散类型的语言中,如果在整数或数字标量变量和字符串之间使用+,则可能不会抛出编译器警告,尝试将串行转换为数字,然后添加它们。
相比之下,.concat()在某些情况下与+相比非常明显和可读。
答案 5 :(得分:1)
+运算符是一个数学运算符。因此,在使用该运算符连接字符串之前,编译器必须决定是将其用作数学运算符以进行添加,还是将其用于字符串连接。
例如:如果你连接a + b + c + d + e + f,编译器会做出5次决策,因为有5 +运算符。
Performancewise不推荐。
但是,如果你只有一个连接,我不认为使用+或Concat()方法在性能方面有很大差异
答案 6 :(得分:0)
说实话;有些人喜欢它。我知道我宁愿使用Concat,因为+真的不是很直观。特别是只是深入研究代码;很难说这些是你正在添加的数字还是两个字符串你的结尾或两个你正在做矢量加法的点。 :)
答案 7 :(得分:0)
我相信它与字符串a + string b相同。 C#中的字符串类型为immutable因此字符串操作的首选方法是通过StringBuilder。正如Guffa总结的那样:“用代码最能代表你的意图。”当然,对于简单的使用,其中性能不是太大关注使用+或concat。