装箱/拆箱和类型转换之间的区别是什么?

装箱是指将不可为空的值类型转换为引用类型,或将值类型转换为它实现的某个接口(例如int to icomparable)。
拆箱是指从对象显式转换为不可为空的值类型,将接口类型转换为不可为空的值类型(例如,IComparableto int)。

        int x = 5;
        object o = x; //将值类型转换成引用类型,这是装箱
        int y = (int)o; //将引用类型转换成值类型,这是拆箱

判断一个类型转换是否构成了装箱或者拆箱。有个前提就是:这两个类型是否存在继承的关系。
如果存在继承关系则有可能发生装箱或者拆箱。如果不存在继承关系,他们一定不会发生装箱或者拆箱。

例子

        ArrayList list = new ArrayList();
        for (int i = 0; i < 10000; i++)
        {
            list.Add(i);
        }

Add(object value) :Add这个方法的参数接收的是一个object类型的数据,根据里氏转换定律。一个地方需要一个父类,那么可以将一个子类给它。因为子类可以隐式的转换成父类。
因此list.Add(i) 这是一个装箱过程。将一个值类型的i 转换成object类型存放到了list这个泛型集合中了。

        string str = "123";
        int a = Convert.ToInt32(str); //将一个引用类型强制转换成一个值类型。

这种情况不构成拆箱操作。因为string 与int类型不构成继承关系。

        int b = 10;
        IComparable ii = b; 

IComparable是一个接口,接口是一个引用类型。而int类型是继承了IComparable接口的。所以将一个值类型的b转换成一个引用类型 ii 那么就构成了装箱了。

发布了82 篇原创文章 · 获赞 155 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/hxl517116279/article/details/96431600
今日推荐