为何说ArrayList[0].ToString()不是拆箱,而(String)ArrayList[0]是拆箱

为什么说ArrayList[0].ToString()不是拆箱,而(String)ArrayList[0]是拆箱?
如果一个ArrayList装的是string类型,那么我从中拿元素出来的时候,是不是ArrayList[0].ToString()这样效率高一点,而强转的(String)ArrayList[0]会有一个拆箱和复制的操作?

这个说法准确吗? 能否用什么工具验证一下结论呢?

------解决思路----------------------
本帖最后由 bdmh 于 2014-09-24 14:27:16 编辑
list[0].ToString();的IL代码

    L_0017: callvirt instance object [mscorlib]System.Collections.ArrayList::get_Item(int32)
    L_001c: callvirt instance string [mscorlib]System.Object::ToString()
//调用指定类型的ToString方法


(String)list[0];IL代码

    L_0024: callvirt instance object [mscorlib]System.Collections.ArrayList::get_Item(int32)
    L_0029: castclass string
//Castclass     尝试将引用传递的对象转换为指定的类

------解决思路----------------------
string是个类型
String是个类
这就是区别
------解决思路----------------------
一个是类型转换,一个是类的转换
类型转换只是调用了类里的静态方法来执行转换
而类的转换,要实例化整个类
------解决思路----------------------
根本就没有值类型,哪里来的装箱,两者都不是。
------解决思路----------------------
string对象本来就是引用类型,而且string类型的比较是使用值类型比较一样的方式,都是比较值
所以不管是返回自身的引用,还是返回新的引用,你在用的时候是感觉不出有什么区别的
仅仅是效率上的区别
------解决思路----------------------
科普下:

http://msdn.microsoft.com/zh-cn/library/yz2be5wk.aspx

装箱是将值类型转换为 object 类型或由此值类型实现的任何接口类型的过程。


装箱和类型转换是两回事,而且ArrayList早就该被废弃了。