这两个陈述有什么区别?哪个在性能方面更好?
Console.Writeline(i);
Console.Writeline(i.toString());
其中i是字符串或整数。
答案 0 :(得分:14)
最重要的是,写入控制台必然会在这里主导性能 - 即使你将它重定向到某种“空”接收器。
差异,IMO,是
Console.WriteLine(i);
阅读起来比较简单......所以我使用 在这种情况下,当它是一个整数时,两种形式都不会最终装箱 第一个表格将整数;第二个不会。性能差异? Nothing significant. i
,因为WriteLine(int)
有一个重载。 稍微更有趣的问题是在这两行之间:Console.WriteLine("Some format {0} stuff", i);
Console.WriteLine("Some format {0} stuff", i.ToString());
答案 1 :(得分:2)
没有实际区别,两者都会调用ToString将数字转换为字符串。
答案 2 :(得分:1)
应该 没有区别。如果你自己没有明确地这样做,Console.WriteLine方法应该自动调用ToString()方法。但是,如果您查看IL代码,我会惊讶地发现它们不相同。显然,Console.Writeline(int)必须在内部将int转换为十进制字符串,但这在IL中并不明显......
对于此代码:
static void Main(string[] args)
{
int i = 34;
Console.WriteLine(i);
Console.WriteLine(i.ToString());
}
IL
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] int32 i)
L_0000: nop
L_0001: ldc.i4.s 0x22
L_0003: stloc.0
L_0004: ldloc.0
L_0005: call void [mscorlib]System.Console::WriteLine(int32)
L_000a: nop
L_000b: ldloca.s i
L_000d: call instance string [mscorlib]System.Int32::ToString()
L_0012: call void [mscorlib]System.Console::WriteLine(string)
L_0017: nop
L_0018: ret
}
使用Jon的示例(使用string.format),第一种情况(没有ToString()
)值 是 框...
代码:
int i = 34;
Console.WriteLine(string.Format("Some format {0} stuff", i));
Console.WriteLine(string.Format("Some format {0} stuff", i.ToString()));
IL
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (
[0] int32 i)
L_0000: nop
L_0001: ldc.i4.s 0x22
L_0003: stloc.0
L_0004: ldstr "Some format {0} stuff"
L_0009: ldloc.0
L_000a: box int32
L_000f: call string [mscorlib]System.String::Format(string, object)
L_0014: call void [mscorlib]System.Console::WriteLine(string)
L_0019: nop
L_001a: ldstr "Some format {0} stuff"
L_001f: ldloca.s i
L_0021: call instance string [mscorlib]System.Int32::ToString()
L_0026: call string [mscorlib]System.String::Format(string, object)
L_002b: call void [mscorlib]System.Console::WriteLine(string)
L_0030: nop
L_0031: ret
}
答案 3 :(得分:0)
首先,优化到这个级别真的不会给你带来任何好处。优化您的算法,然后分析并优化您的瓶颈。我会专注于哪个更具可读性和可维护性(在这两种情况下我更喜欢第一个......)
然而,从性能的角度来看,第一个通常会更好。如果用int调用第一个,它会有效地调用第二个。使用字符串,您将获得额外的(无操作)方法调用。