dotnet学习笔记一 - 装箱拆箱

原创 2003年07月20日 00:35:00

转眼作程序员已经四年了,自己也算是这一行的老人了。回头看看,自己做过的东西不算少,从应用程序到内核驱动,从普通程序到Web应用,从WindowsLinux。市面上流行的开发工具语言也都用过,VCVBDELPHIBCBJBUILDERASPJSP。不过扪心自问,那些是自己专长的呢?好像没有,找工作的时候也是项目作了不少,算得上精通的,好像没有。.NET以前也接触过,但是没有深入,前一段时间由于一段机缘,对.NET产生了喜欢之情,好强大,C#也是很规整的OO语言。再加上自己对WIN平台的多年的感情,决定投入到轰轰烈烈的.NET事业中去。书看过了需要消化和实践,自己感觉把理解的东西写出来是很好的一种消化方法,就萌生了把自己看得东西写成一套学习笔记的想法。这篇是开篇,抛砖引玉,希望各位.NET界的师兄元老们多多指点,希望和和我一样立志于学习应用.NET技术的朋友们一起讨论,一起提高。

.NET算是集现有开发平台语言之大成了,也提出了不少新概念。装箱(boxing)和拆箱(unboxing)应该是一个了。

.NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, shortbool等等,就是说所有的事物都是对象。但这样造成了及底的效率,比如简单的两个数相加,bool取反都会导致从堆(Heap)中分配内存。怎样解决这个问题呢?.NET把类型分成了两类:值型和引用型。

值型在栈中分配内存,它们在声明的同时就初始化,以确保数据不为NULL。例如:

byte b = 33;

上边的声明就在栈中分配了8位的内存,并将变量初始化为8.NET的值型包括枚举(enum),结构(structure)和基本类型(int, float, short等)。值型不需要Garbage Collection来回收占用的内存。超出了作用范围后,系统会自动释放。

引用型就完全类似于c++或者java中的类了,在堆中分配内存,初始化为null。引用型是需要Garbage Collection来回收内存的。

既然值型也是从System.Object中继承过来的,那么这样一句话就应该是合法的:

int n=3;

System.Object obj = n;

正如上面所说,n这个变量的内存应该是在栈中分配内存,而obj则应该在栈中分配内存。这时候系统都作了哪些工作呢?系统在堆中分配了一个对象obj,并将n的值复制给它。这就叫做装箱(boxing。这时候n obj就是两个没有关联的对象了,继续运行如下的代码:

obj = 9;

Console.WriteLine( “{0}{1}”, n, obj );

得到的结果就是:

39

简单的说装箱就是隐式的将一个值型转换为引用型对象。

和装箱对应的就是拆箱了,拆箱(unboxing就是将一个引用型对象转换成任意的值型。与装箱不同,拆箱是显示的操作。如下面的代码:

int i=0;

System.Object obj = i;

int j=(int)obj;

由此可见.NET的类型系统是统一的类型系统,因为不管是值型还是引用型都被看作对象,这样就允许我们可以使用一致的方式跨代码处理类型。看一看下面的一段代码更能清楚地了解装箱的好处:

ArrayList ar = new ArrayList();

Date dt = new Date();

ar.Add( dt );

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

int n = 10;

ar.Add( n );

正如最好两行代码,我们不用显示的分配一个System.Object,或者做强制的类型转换。只要用我们最常用到的int就可以和其他的引用型对象一样处理了。在最后一行代码中,当n加入到数组中时,它已经被自动的装箱了。

 

.NET的装箱与拆箱内幕

装箱与拆箱是.NET中非常重要的概念。 装箱是将值类型转换成引用类型,或者是实现了接口的值类型。装箱将数据存储的空间由Thread stack转存到了Managed Heap中。凡是在Managed ...
  • xxdddail
  • xxdddail
  • 2014年07月04日 16:49
  • 1609

.Net中的装箱拆箱

说到装箱与拆箱,那就要简要的概括下什么是装箱拆箱, 装箱:其实就是把值类型转换为引用类型。 拆箱:其实就是把引用类型转换为值类型。 值类型:一般来说包括   int  char bool doub...
  • itmaxin
  • itmaxin
  • 2014年09月13日 16:04
  • 1346

dotnet学习笔记一 - 装箱拆箱

转眼作程序员已经四年了,自己也算是这一行的老人了。回头看看,自己做过的东西不算少,从应用程序到内核驱动,从普通程序到Web应用,从Windows到Linux。市面上流行的开发工具语言也都用过,VC,V...
  • kenli
  • kenli
  • 2003年07月20日 00:35
  • 1997

dotnet学习笔记一 - 装箱拆箱

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 15:26
  • 61

dotnet学习笔记一 - 装箱拆箱 kenli(原作)

 .NET算是集现有开发平台语言之大成了,也提出了不少新概念。装箱(boxing)和拆箱( unboxing)应该是一个了。 .NET的所有类型都是由基类System.Object继承过来的,包括最...
  • sleepydog
  • sleepydog
  • 2007年09月08日 11:30
  • 444

C# 之装箱与拆箱

C# 之装箱与拆箱
  • baidu_28217989
  • baidu_28217989
  • 2017年07月26日 10:50
  • 248

深入理解C#的装箱和拆箱

 深入理解C#的装箱和拆箱 装箱和拆箱是值类型和引用类型之间相互转换是要执行的操作。  1. 装箱在值类型向引用类型转换时发生 2. 拆箱在引用类型向值类型转换时发生 光上述...
  • taoerchun
  • taoerchun
  • 2015年07月01日 12:53
  • 760

Ionic3学习笔记(一)

(一)ionic3环境准备:    1.安装Node.js(安装之后执行node -version检查是否安装成功)     2.安装npm。  命令:npm install npm -g   ...
  • Dan_2017
  • Dan_2017
  • 2017年11月28日 21:46
  • 165

C# - 再谈C#的装箱和拆箱

上一篇写了一下装箱拆箱的定义和IL分析,这一篇我们看下使用泛型和不使用泛型引发装箱拆箱的情况 1. 使用非泛型集合时引发的装箱和拆箱操作  看下面的一段代码: 1 2 3 ...
  • honey199396
  • honey199396
  • 2016年08月31日 11:35
  • 539

装箱和拆箱(boxing&unboxing)-.NET

.NET的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。如果申明这些类型得时候都在堆(HEAP...
  • wuming22222
  • wuming22222
  • 2014年07月11日 19:29
  • 474
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:dotnet学习笔记一 - 装箱拆箱
举报原因:
原因补充:

(最多只允许输入30个字)