【发布时间】:2009-11-24 04:03:16
【问题描述】:
我想了一段时间。为什么使用String.Concat() 而不是+ 运算符。我理解String.Format,因为它使用+ 运算符使您的代码看起来更漂亮。
例如:
string one = "bob";
string two = "jim";
string three = one + two;
string three = String.Concat(one, two);
【问题讨论】:
我想了一段时间。为什么使用String.Concat() 而不是+ 运算符。我理解String.Format,因为它使用+ 运算符使您的代码看起来更漂亮。
例如:
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 实际上有 + 运算符,这可能是导致如果您尝试在反射中使用它会感到困惑!
+ 的一个好处是,如果所有参数都是常量表达式,编译器将为您执行连接,因此您无需在执行时执行此操作。这种微小的性能优势在大多数代码中并不显着,但是当我发现最易读的代码也具有性能优势时,它总是很好:)
【讨论】:
我自己也有同样的问题,这个问题促使我调查了一下,
我创建了以下类
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(),这是隐式完成的,所以你不需要担心对象的类型。
string.Concat(foo, bar); 可以处理空值。 foo.ToString() + bar.ToString() 将导致 NullReferenceException。
+ 运算符是一个数学运算符。因此,在使用该运算符连接字符串之前,编译器必须决定是将其用作数学运算符以进行加法还是将其用于字符串连接。
例如:如果你连接 a+b+c+d+e+f,编译器会做出 5 次决定,因为有 5 个 + 运算符。
性能方面不推荐。
但是,如果你只有一个连接要做,我认为使用 + 或 Concat() 方法在性能方面没有太大差异
【讨论】:
便携性(您的)。
在其他语言中,当出现两个字符串时,+ 可能不会像您期望的那样连接。它可能会做一些完全出乎意料的事情。或者,在一些松散类型的语言中,如果你在整数或数字标量变量和字符串之间加上 +,它可能不会引发编译器警告,尝试将字符串转换为数字,然后添加它们。
相比之下,在某些情况下,.concat() 与 + 相比是相当明显和可读的。
【讨论】:
说实话;有些人更喜欢它。我知道我宁愿使用 Concat 因为 + 真的不是很直观。尤其是深入研究代码;很难判断这些是您要添加的数字,还是您连接的两个字符串,还是您正在使用向量加法的两个点。 :)
【讨论】:
我相信它与字符串 a + 字符串 b 相同。 C# 中的字符串类型为immutable,因此字符串操作的首选方式是通过 StringBuilder。正如 Guffa 总结的那样:“使用最能代表您的代码意图的代码”。当然,对于性能不太重要的简单用法,请使用 + 或 concat。
【讨论】: