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

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

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

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

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

提前致谢。

+ concatenation反正使用String.ConcatString本身不暴露+运算符。

例如:

 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调用的版本会稍微提高效率 – 但我非常怀疑它是否会很重要,我强烈建议您使用您认为更具可读性的版本。

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

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

我会使用.ToString()出于习惯和可读性,我相信你会发现其他地方可以更好地保存性能。

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

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

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

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

因为在这里你的结果是在字符串中,而我是int,所以“Bar _”+ i被连接起来并且将为对象调用.ToString()以附加字符串。 关于性能,您可以使用一些性能测量工具

我通常使用铸造,如果我有两个差异对象