首页 > 技术文章 > int值类型的ToString()方法是否装箱

lvqiang 2019-12-31 10:51 原文

先说答案,没有装箱!

首先,我说一点题外话,什么是装箱

N无论是值类型还是引用类型,他们都继承自Object,只不过,值类型是孙子,引用类型是儿子,值类型是先继承自ValueType,ValueType继承自Object。

我之前也说过装箱和拆箱,两种不同的类型本身就不能划等号,要想把一种类型变成另一种类型,我们必须做一些操作,使得这种类型通过某种手段添加或删除某些类型特征,变成另外一种类型。

值类型,就是单纯的在栈上开辟一块内存空间,把数据直接放进去。引用类型是在堆上开辟一块空间,也把数据放进去,但除了数据成员,他还有另外一些默认成员:类型对象指针和同步索引块(同步索引块就先不说了,他是表线程同步的。)

但引用类型这些箱子,是随机摆放的,所以他不仅在堆上开辟空间,他还在栈上有一块空间,用来存放堆地址,指向堆中数据的位置。而装箱,就是把值类型从栈上把数据复制一份,同时在堆上开辟一块空间,把数据放进去(同时还有类型对象指针和同步索引块),从而形成一个“箱子”,并把地址指针返回到栈上,同时栈开辟空间把这个地址存进去,至此,装箱完成。

 

到这,我们就能明白下面说的了,所有类型都能用ToString(),因为他是Object的虚方法,但是在int32类型中,他重写了Object的虚方法:

 

 所以,我们用int32的ToString()方法时,JIT(即时编译器)会直接调用,将此实例的数值转换为其等效的字符串表示形式,这只是一种表示形式的转换,并没有涉及到类型的转换,也就没有装箱。

推荐阅读