字符串连接是否有.ToString()?

时间:2009-12-29 14:01:51

标签: c# .net .net-3.5

我有一个声明,其中以下列方式分配字符串:

for (int i = 0; i < x; i++) 
{
    Foo.MyStringProperty = "Bar_" + i.ToString();
    /* ... */
}

i.ToString()或普通i之间是否有任何性能差异,因为两者都只是转换为(culture invariant?)字符串等效?

我很清楚String.Concat()String.FormatStringBuilder等是否存在,但为了这种情况,我们假设我只能使用{{1}连接。

提前致谢。

5 个答案:

答案 0 :(得分:23)

无论如何,

+串联使用String.Concat - String本身不会公开+运算符。

例如:

int i = 10;
string x = "hello" + i;

编译成:

int i = 10;
object o1 = "hello";
object o2 = i; // Note boxing
string x = string.Concat(o1, o2);

直接调用ToString会避免装箱并调用Concat(string, string)重载。因此,ToString调用的版本将稍微更高效 - 但我非常怀疑它会非常重要,我强烈建议您选择您认为的任何版本更具可读性。

答案 1 :(得分:6)

只需使用string + object强制对对象调用ToString() - 它等同于显式调用它。

答案 2 :(得分:2)

ToString是用于编写对象的默认方法。所以,如果你使用“i”或“i.ToString()”是一回事。

如果您对c ++中的运算符重载有所了解,可以理解“+”在这种情况下的工作原理。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;


public class MainClass
{
    public static void Main()
    {
        int number = 10;
        string msg = "age is " + number + ".";
        msg += " great?";
        Console.WriteLine("msg: {0}", msg);

        String s1 = 10 + 5 + ": Two plus three is " + 2 + 3;
        String s2 = 10 + 5 + ": Two plus three is " + (2 + 3);
        Console.WriteLine("s1: {0}", s1);
        Console.WriteLine("s2: {0}", s2);    }

}

<强>结果: msg:年龄是10岁吗?

s1:15:两加三是23

s2:15:两加三是5

答案 3 :(得分:0)

我会根据习惯和可读性使用.ToString(),我相信你会在其他地方找到更好的性能。

答案 4 :(得分:0)

正如Jon Skeet已经提到的,关于拳击的观点非常重要!

如果明确使用 ToString(),则没有装箱,这意味着不会在i周围创建任何对象框。我必须在垃圾收集器之后丢弃我周围的对象框,从而导致性能下降。

如果你在程序中只做了几次并不重要,但是如果你经常打拳,你应该选择 ToString()版本。