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

为什么在C#中使用String.Concat()?,c#,asp.net,.net,string,C#,Asp.net,.net,String,我一直在想这件事。为什么要使用String.Concat()而不是+运算符。我理解String.Format,因为使用+操作符可以使代码看起来更漂亮 例如: string one = "bob"; string two = "jim"; string three = one + two; string three = String.Concat(one, two); 因为您可以使用接受两个对象的版本;) 老实说;有些人更喜欢它。我知道我宁愿使用Concat,因为+确实不是很直观。尤其是在深入

我一直在想这件事。为什么要使用
String.Concat()
而不是
+
运算符。我理解
String.Format
,因为使用
+
操作符可以使代码看起来更漂亮

例如:

string one = "bob";
string two = "jim";

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

因为您可以使用接受两个对象的版本;)

老实说;有些人更喜欢它。我知道我宁愿使用Concat,因为+确实不是很直观。尤其是在深入研究代码时;很难说这些是你要添加的数字,还是两个字符串,或者两个点,你要用它们做向量加法。:)

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


在代码中使用最能代表您意图的字符串。

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

可移植性(您的)

在其他语言中,当使用两个字符串表示时,+可能不会像您预期的那样连接。它可能会做一些完全出乎意料的事情。或者,在一些松散类型的语言中,如果在整数或数字标量变量和字符串之间插入+号,它可能不会抛出编译器警告,尝试将字符串转换为数字,然后添加它们


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

我自己也有同样的问题,这个问题促使我对它进行了一些调查

我创建了以下类

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
类中,重载+运算符也会发生类似的操作集。想法

当我知道要连接多少字符串时,我会使用
+
,但是如果你只有一个数组呢?在这种情况下,您不知道要应用多少次
+
,因此必须调用一个方法(或者自己循环,这很可怕)

不过,我不记得经常调用
string.Concat
——这确实很少见

正如guffa所说,
+
编译成对
string.Concat
的调用——值得注意的是,
string
实际上没有+运算符,如果您试图在反射中使用它,这可能会导致混淆


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

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

例如:如果要连接a+b+c+d+e+f,编译器将做出5次决定,因为有5个+运算符

性能方面,不建议这样做


但是,如果您只需要进行一次连接,我认为在使用+或Concat()方法时,在性能方面不会有太大的差异

如果很难说您要添加的是什么,那么这是变量命名的问题,而不是使用+运算符的问题。当然,如果变量名糟糕透了,String.Concat调用会解决一些问题。我同意。如果你不能判断两个字符串是否被连接,这对代码或程序员来说是一个严重的问题。为什么这很重要?难道你不能直接执行.toString()?@chobo2,如果你调用
String.Concat()
,这是隐式完成的,所以你不需要担心对象的类型。@chobo2,你也需要考虑空值!所以它将“null”转换为字符串,而.toString()不会吗?你不是还要测试空值吗?比如,如果您计划在某个地方使用它来做一些事情,那么测试null不是更好吗?如果是这样的话,在将其转换为字符串之前,您不能对其进行测试吗?
string.Concat(foo,bar)可以使用空值
foo.ToString()+bar.ToString()
将导致NullReferenceException。您所说的“最好用代码表达您的意图”是什么意思?以您和您的开发团队更容易理解的为准。String.Concat的一个优点是,不只是内联地将字符串添加到一起更容易,这不如使用stringbuilder。您使用了两个常量字符串,因此在这种特殊情况下,编译器为您执行了串联。如果使用字符串变量,你会看到C#编译器将+转换为对string.Concat的调用。另一方面,如果你要用一种语言编程,你应该对该语言有一些真正的了解,而不是试图只坚持在任何地方看起来都一样的东西。