第1章 基本语言要素
string str1="str1"+9;//先对9装箱成Int32
string str2="str1"+9.ToString();//直接Concat()
装箱——将值类型转换成引用类型:
int i = 1; object o = i;
--这里会首先开辟4个字节的栈空间来存放变量i,然后会开辟变量o,这是一个4字节的指针,这个指针用于指向堆中的数据存放的首地址。这时需要将变量i所需的空间开辟到堆中,然后让o的指针指向新开辟的堆中的首地址处。这就是装箱。
拆箱——将引用类型转换为值类型:
object o = 1; int i = (int)o;
--这里的操作刚好和转向相反。会先在堆栈中开辟指针o的空间,然后指向堆中数据1所需的开辟了的数据空间首地址。然后,强转的拆箱操作会将堆中的数据重新赋值(不是复制哦)到栈——也就是在栈中重新开辟强转类型(这里是int)在栈中需要的内存空间,并将数据o在堆中的数据赋值过来。因为这里还需要多一步判定,就是判断o是否可以被正确的转换成int(不是会经常看到InvalidCastException么,这就是判断后并抛出异常的结果)。所以拆箱更消耗性能。
阅读(1761) | 评论(0) | 转发(0) |