【问题标题】:Why use String.Concat() in C#?为什么在 C# 中使用 String.Concat()?
【发布时间】: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);

【问题讨论】:

    标签: c# asp.net .net string


    【解决方案1】:

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

    在代码中使用最能代表您意图的那个。

    【讨论】:

    • 你的意思是“用代码最能代表你的意图”?
    • 哪个对您和您的开发团队更易读。 String.Concat 的一个优点是它更容易只是继续将字符串添加到一起内联,这不如使用 stringbuilder 性能好。
    【解决方案2】:

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

    我不记得经常打电话给string.Concat - 这绝对是罕见的。

    正如 guffa 所说,+ 无论如何都会编译为对 string.Concat 的调用 - 值得注意的是,string 实际上 + 运算符,这可能是导致如果您尝试在反射中使用它会感到困惑!

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

    【讨论】:

      【解决方案3】:

      我自己也有同样的问题,这个问题促使我调查了一下,

      我创建了以下类

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

      【讨论】:

      • 您使用了两个常量字符串 - 因此在这种特殊情况下,编译器已经为您执行了连接。使用字符串 variables 执行此操作,您会看到 C# 编译器将 + 转换为对 String.Concat 的调用。
      【解决方案4】:

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

      【讨论】:

      • 为什么这很重要?你不能只做 .toString() 吗?
      • @chobo2,如果你调用String.Concat(),这是隐式完成的,所以你不需要担心对象的类型。
      • @chobo2,你也需要考虑空值!
      • 所以它将“空值”转换为字符串而 .toString() 不会?你还不需要测试null吗?就像您计划在某处使用它来做某事一样,测试空值不是更好吗?如果是这种情况,您不能在将其转换为字符串之前对其进行测试吗?
      • string.Concat(foo, bar); 可以处理空值。 foo.ToString() + bar.ToString() 将导致 NullReferenceException。
      【解决方案5】:

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

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

      性能方面不推荐。

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

      【讨论】:

        【解决方案6】:

        便携性(您的)。

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

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

        【讨论】:

        • 另一方面,如果您要使用一种语言进行编程,您应该对该语言有一定的了解,而不是试图只坚持在任何地方看起来都一样的东西。跨度>
        【解决方案7】:

        说实话;有些人更喜欢它。我知道我宁愿使用 Concat 因为 + 真的不是很直观。尤其是深入研究代码;很难判断这些是您要添加的数字,还是您连接的两个字符串,还是您正在使用向量加法的两个点。 :)

        【讨论】:

        • 如果很难分辨你要添加的是什么,那就是变量命名的问题,而不是使用 + 运算符。当然,如果变量名很糟糕,String.Concat 调用会清除一些东西。
        • 我同意。如果您无法判断两个字符串正在连接,那么这对代码或程序员来说是一个严重的问题。
        【解决方案8】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-02
          • 1970-01-01
          • 1970-01-01
          • 2021-03-31
          • 2010-10-07
          • 1970-01-01
          • 2015-06-08
          • 2014-01-04
          相关资源
          最近更新 更多