调用ToString()来防止拳击

时间:2014-06-18 04:47:07

标签: c# boxing

使用以下代码段:

public static void Main()
{
    int v = 2;
    Console.WriteLine("number" + "," + v);
}

显然,最好在调用v时将v.ToString()替换为WriteLine(),以防止值类型被加框。 但是,调用ToString()仍然会在堆上分配一个对象,就像装入值类型一样。

那么使用v.ToString()而不是让它被装箱有什么好处呢?

1 个答案:

答案 0 :(得分:19)

ToString()只会在其类型没有覆盖ToString()的情况下对其进行处理(因此必须转到Object类的实现)。但是,int确实有一个被覆盖的ToString()(请参阅http://msdn.microsoft.com/en-us/library/6t7dwaa5(v=vs.110).aspx),所以这不会发生。

装箱实际上是由+运算符执行的,因为它只调用string.Concat,它需要类型为Object(或string的参数,具体取决于哪个重载是用过的)。因此,必须为整数调用整数。然后,string.Concat方法再次将int取消装箱并调用ToString()。因此,如果您自己调用它,您将无需进行装箱和拆箱,从而节省时间。

虽然在大多数情况下它会非常有限,但仍有性能提升。