龙空技术网

C#之装箱和拆箱

十二先森呐 429

前言:

今天小伙伴们对“装箱问题c语言怎么写”大致比较关注,小伙伴们都想要剖析一些“装箱问题c语言怎么写”的相关资讯。那么小编也在网上汇集了一些有关“装箱问题c语言怎么写””的相关内容,希望兄弟们能喜欢,兄弟们一起来了解一下吧!

其实就是值类型和引用类型的转换,之所以可以这样转换是因为CTS允许这样做。

装箱

就是把值类型转换为引用类型。

int i = 1;object o = i;	

过程:

1. 在堆中申请内存

2. 将值类型的字段值拷贝到新分配的内存中

3. 返回新引用对象的内存地址(给栈上的引用)

装箱

拆箱

把装箱后的引用类型转换为值类型,这个过程不一定会成功。

过程:

1. 检查是否为Null,检查实例是否为给定值类型的装箱值,否则抛异常,最后获得对象各个成员的地址

2. 创建一个新对象,并将第一步获得的值赋值到新对象中

通常来说,拆箱的目的就是为了将值拷贝到一个值类型中。

与拆箱比较,装箱的性能消耗更大,因为引用对象的分配更复杂,值类型分配在栈上,分配和释放效率都很高,装箱过程需要创建一个新的引用类型对象实例。

看两种类型是否发生了装箱或者拆箱,要看,这两种类型是否存在继承关系。

装箱的时候是什么类型,拆箱的时候也必须使用对应的类型

如何避免装箱和拆箱

C#1时,没有泛型,要定义一组自定义类型的数组只能用ArrayList,ArrayList支持任何类型,所以方法参数全都是object,所以即使我们类型为结构体,也会被隐式的装箱,使用时再拆箱。

C#2的泛型就解决了这个问题,使用泛型集合就可以避免不必要的装箱和拆箱。

隐藏的装箱有很多,比如结构体的判等。

struct Rectangle{	public override bool Equals(object obj)	{    //	... 	 } }

默认签名为将两个比较对象转为object,引起了装箱,解决方法是让结构体实现IEquatable<T>接口:

struct Rectangle : IEquatable<Rectangle>{	public bool Equals(Rectangle r)	{		// … 	 }} 

标签: #装箱问题c语言怎么写