我有一个声明,其中以下列方式分配字符串:
for (int i = 0; i < x; i++)
{
Foo.MyStringProperty = "Bar_" + i.ToString();
/* ... */
}
i.ToString()
或普通i
之间是否有任何性能差异,因为两者都只是转换为(culture invariant?)字符串等效?
我很清楚String.Concat()
,String.Format
,StringBuilder
等是否存在,但为了这种情况,我们假设我只能使用{{1}连接。
提前致谢。
答案 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()版本。