C#中Boxing和Unboxing

开发 后端
本文介绍C#中Boxing和Unboxing,相比较C++,C#中的值类型和引用类型很简单:所有的基本类型、结构和String属于值类型,其它类型都属于引用类型。那么值类型和引用类型有什么区别呢?

相比较C++,C#中的值类型和引用类型很简单:所有的基本类型、结构(struct)和String属于值类型,其它类型(其实也只剩下class了)都属于引用类型。那么值类型和引用类型有什么区别呢?

值类型在赋值操作(“=”操作,函数参数,函数返回等)的时候,会把所有成员变量拷贝一遍给目标实例。

引用类型在赋值操作的时候,只是把实例的内存中的地址赋值给目标实例。

那么这两者有什么区别呢?

那就是效率了:

引用类型的赋值只要传递一个内存地址,传递的数据量就是一个32(64位操作系统是64)位整数。

值类型需要传递该类型所包含的所有数据。

比如:

  1. struct Point  
  2. {  
  3. public int x;  
  4. public int y;  

那Point类型的实例在赋值的时候,要传递的数据量是两个整数。

如果数据量更大的结构,每次赋值的时候都要传递一遍所有的成员,那么总的程序运行期内,传递的数据量就非常可观了。

怎么解决这种效率问题呢?

有两种方法:

1 使用ref关键字。

2 就是用所谓的Boxing和Unboxing了。

首先,C#中Boxing和Unboxing是针对值类型数据而言的。对引用类型来说,它本身就是引用类型,所以不存在Boxing和Unboxing的概念。

其次,Boxing的操作就是把值类型的数据赋值到一个object的引用类型实例中,这个过程是值赋值的过程(就是所以数据都copy一遍)。

如:

Point p = new Point{x=10, y=11};

Object o = p;

这个变量o就是Boxing之后的引用类型了。记住一点,boxing之后,变量o就跟p无关了,它们是两个不同类型的变量,指向不同的内存地址。

***,Unboxing的操作是把这个object的引用类型实例,以值传递的方式赋值给目标对象。

如:

Point p2 = (Point)o;

unboxing之后,p2跟o就无关了,它们是两个不同类型的变量,指向不同的内存地址。

也就是说,Boxing和Unboxing的***用途就是用于数据传递。

理解Boxing和Unboxing还要与class的类型向父类/子类转换的操作区别开来(面向对象语言的继承机制)。

将一个class的实例转换成它的父类或子类类型,这是类的继承机制。这种转换其实只是把实例的类型信息变了下,实例对应的数据,内存地址都没变动。转换前后的实例都是指向同一块内存。

但我们可以把C#中Boxing和Unboxing和class继承机制统一起来,用一句话来概括就是:引用进,引用出;值进,值出。

【编辑推荐】

  1. C#调用Windows API函数
  2. 详解C#调用Outlook API
  3. C#连接Access、SQL Server数据库
  4. 介绍C#调用API的问题
  5. C#调用Excel与附加代码
责任编辑:佚名 来源: 百度空间
相关推荐

2024-03-19 14:41:08

C#操作符开发

2009-08-27 16:11:03

C# delegateC# event

2009-08-13 17:04:09

C#语言C#程序

2024-10-05 00:00:35

Action​C#Func​

2024-05-30 12:24:03

C#开发

2011-06-17 16:42:23

C#

2009-08-26 10:34:15

C#类型C#变量

2009-08-19 16:50:32

Visual C#C#语言特性

2009-08-03 15:06:43

C# Stack对象C# Queue对象

2009-08-28 17:18:55

foreach循环

2024-09-29 09:28:38

Action​C#

2009-08-06 15:40:11

C#装箱和拆箱

2011-06-08 13:50:39

C#类型转换

2009-07-31 16:06:50

成员函数构造函数C#

2009-08-10 10:04:25

C#抽象类C#接口

2009-09-01 17:51:47

C#拆箱C#装箱

2009-08-19 10:09:21

C#和C++

2009-08-27 16:18:47

C#类C#结构体

2009-08-26 09:54:45

C#打印预览C#打印

2009-08-21 11:31:59

异步和多线程的区别
点赞
收藏

51CTO技术栈公众号