C#之装箱和拆箱
2016-12-17 15:42
836 查看
简介:
我们都知道,C#中的每一种类型要么是值类型,要么是引用类型。所以每个对象要么是值类型的实例,要么是引用类型的实例。值类型和引用类型之间的转换称为装箱和拆箱。
装箱:值类型转换为引用类型。
拆箱:引用类型转换为值类型。
在详细介绍装箱和拆箱之前,先总结一下什么是值类型和引用类型?
值类型、引用类型:
值类型和引用类型都继承System.Object,引用类型直接从System.Object继承,而值类型则继承其子类,即直接继承System.ValueType。值类型:
引用类型:
数组:(派生于System.Array)数组的元素,不管是引用类型还是值类型,都存储在托管堆上;类:class(派生于System.Object);
接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。);
委托:delegate(派生于System.Delegate);
object:(System.Object的别名);
字符串:string(System.String的别名)。
装箱:
int val = 100; object obj = val; Console.WriteLine (“对象的值 = {0}", obj);这是一个装箱的过程。
详细步骤(box)
1、在堆上分配一个内存空间,大小等于需要装箱的值类型对象的大小加上两个引用类型对象都拥有的成员:类型对象指针和同步块引用。
2、把堆栈上的值类型对象复制到堆上新分配的对象。
3、返回一个指向堆上新对象的引用,并且存储到堆栈上被装箱的那个值类型的对象里。
注:这个步骤不需要我们自己编写,任何装箱的地方,编译器会自动加上执行以上功能的IL代码。
拆箱:
int val = 100; object obj = val; int num = (int) obj; Console.WriteLine ("num: {0}", num);
这是拆箱的过程,将值类型转换成引用类型,再由引用类型转换成值类型的过程。
注:被装过箱的对象才能被拆箱。
详细步骤(unbox)
1、获取已装箱的对象的地址
2、将值从堆上的对象中复制到堆栈上的值变量中
拆装箱的优缺点:
每次装箱需要在堆中new一个新的对象,当量特别大时会影响程序的效率,拆箱过程对性能损耗较小。
总结:
看C#视频的时候接触过装箱和拆箱,当时不是很理解,最近看.net之美的时候看到这部分终于有点共鸣了,学习真的是一个反复的过程,需要慢慢吸收。
相关文章推荐
- C#“装箱”(boxing)与“拆箱”(unboxing)
- C# 装箱和拆箱[整理]
- C#中的"装箱"(boxing)与"拆箱"(unboxing)
- C# 指南之装箱与拆箱
- C#的装箱和拆箱
- C#中的装箱与拆箱
- C#核心概念--装箱和拆箱(什么是装箱和拆箱)
- [C# Tips]再谈值类型的装箱和拆箱
- C#中的装箱(boxing)拆箱(unboxing)
- 关于C#装箱与拆箱的研究
- 【C#】装箱和拆箱
- c#中的装箱(boxing)和拆箱(unboxin)
- C#中的“装箱”(boxing)与“拆箱”(unboxing)
- C#中的“装箱”(boxing)与“拆箱”(unboxing) (转载)
- C#中的装箱(boxing)拆箱(unboxing)
- C#中的装箱与拆箱的概念
- C# tips ---值类型的装箱和拆箱
- C#装箱与拆箱
- C#中的“装箱”(boxing)与“拆箱”(unboxing)_C#教程
- c#装箱,拆箱