日期:2014-05-16  浏览次数:21064 次

Console.WriteLine();装箱问题
请问C#中
int i = 1;
Console.WriteLine(i); *这条语句中执行了装箱!那有没有再执行拆箱操作*


Console.WriteLine(i.ToString()); *进行了手动装箱*
请问手动装箱和隐形装箱相比,效率如何?

请指教,谢谢
------解决方案--------------------
Console.WriteLine(i.ToString())
可没有进行装箱,从没听说过什么“手动装箱”的概念,不知道又是哪本书自己编出来的。

首先i是值类型,其次i是一个int类型,再然后int类型重写了tostring方法,这种情况下,直接调用int类型的tostring方法不会进行装箱。
这里面的原因有几个方面,因为值类型不允许继承,所以值类型里面的方法(包括重写的和新定义的),都不需要去继承链上查找,直接调用值类型的方法即可。这里的tostring就是这种情况。

再举个例子,假如你调用的是i.GetType(),那么就会发生装箱,因为int并没有重写这个方法(事实上也无法重写,因为这是Object类型的非虚方法),所以实际上需要调用Object上的GetType()方法,所以需要对i进行装箱,因为i没有这个方法而Object类型有。
------解决方案--------------------
Console.WriteLine(i);
没有装箱
因为它执行的是Console.WriteLine(int)这种重载形式。
------解决方案--------------------
引用:
Console.WriteLine(i.ToString())
可没有进行装箱,从没听说过什么“手动装箱”的概念,不知道又是哪本书自己编出来的。

首先i是值类型,其次i是一个int类型,再然后int类型重写了tostring方法,这种情况下,直接调用int类型的tostring方法不会进行装箱。
这里面的原因有几个方面,因为值类型不允许继承,所以值类型里面的方法(包括重写的和新定义的),都不需要去继承链上查找,直接调用值类型的方法即可。这里的tostring就是这种情况。

再举个例子,假如你调用的是i.GetType(),那么就会发生装箱,因为int并没有重写这个方法(事实上也无法重写,因为这是Object类型的非虚方法),所以实际上需要调用Object上的GetType()方法,所以需要对i进行装箱,因为i没有这个方法而Object类型有。


tostring那不叫装箱
但是int -> string的话,就在堆上创建了对象了,这个跟装箱的原理貌似一样