装箱与拆箱C#(一)
2016-06-12 09:05
302 查看
局部变量值类型直接包含了它们的数据,而接口和Object包含的是它们的引用,当从一个值类型转换为它所实现的接口或基类object时,即装箱
装箱(从值类型转换到引用类型)步骤:
1.首先在堆中分配好内存。用于存放值类型的数据以及少许额外开销(包括方法表指针、SyncBlock-Index)
2.之后进行内存复制,栈上的值类型数据复制到堆上分配好的位置
3.更新对象或接口的引用,指向堆的位置
拆箱则与之相反。CIL指令unbox只对堆上的数据进行解引用,不包括从堆复制到栈的动作。但C#中多数会紧接在拆箱后发生一次复制动作。
下面介绍通过CIL查看,在一个特定代码片段中统计box/unbox指令的数量
C#代码 CIL代码
static void Main(string[] args) .method private hidebysig
static void Main() cil managed
{ { .entrypoint
//code size 21(0*15)
.maxstack 1
int number; .locals init ( [0] int 32 number,
object thing; [1] object thing)
number = 42; IL_0000:nop
IL_0001:ldc.i4.s 42
IL_0003:stloc.0
//Boxing IL_0004:ldloc.0
thing = number; IL_0005:box [mscorlib]System.Int32
IL_000a:stloc.1
//Unboxing IL_000b:ldloc.1
number = (int)thing; IL_000c:unbox.any [mscorlib]System.Int32
IL_0011:stloc.0
IL_0012:br.s IL_0014
return; IL_0014:ret
} } // end of method Program::Main
装箱进行不频繁,性能问题不大。但装箱易忽略!!!
装箱(从值类型转换到引用类型)步骤:
1.首先在堆中分配好内存。用于存放值类型的数据以及少许额外开销(包括方法表指针、SyncBlock-Index)
2.之后进行内存复制,栈上的值类型数据复制到堆上分配好的位置
3.更新对象或接口的引用,指向堆的位置
拆箱则与之相反。CIL指令unbox只对堆上的数据进行解引用,不包括从堆复制到栈的动作。但C#中多数会紧接在拆箱后发生一次复制动作。
下面介绍通过CIL查看,在一个特定代码片段中统计box/unbox指令的数量
C#代码 CIL代码
static void Main(string[] args) .method private hidebysig
static void Main() cil managed
{ { .entrypoint
//code size 21(0*15)
.maxstack 1
int number; .locals init ( [0] int 32 number,
object thing; [1] object thing)
number = 42; IL_0000:nop
IL_0001:ldc.i4.s 42
IL_0003:stloc.0
//Boxing IL_0004:ldloc.0
thing = number; IL_0005:box [mscorlib]System.Int32
IL_000a:stloc.1
//Unboxing IL_000b:ldloc.1
number = (int)thing; IL_000c:unbox.any [mscorlib]System.Int32
IL_0011:stloc.0
IL_0012:br.s IL_0014
return; IL_0014:ret
} } // end of method Program::Main
装箱进行不频繁,性能问题不大。但装箱易忽略!!!
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析
- C#比较二个数组并找出相同或不同元素的方法