C#中的装箱和拆箱

什么是装箱和拆箱

装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用类型中架起一做桥梁.

换言之,可以轻松的实现值类型与引用类型的互相转换,装箱和拆箱能够统一考察系统,任何类型的值最终都可以按照对象进行处理.

C#语言中的所有类型都是由基类System.Object继承过来的,包括最常用的基础类型:int, byte, short,bool等等,就是说所有的事物都是对象。如果声明这些类型得时候都在堆(HEAP)中分配内存,会造成极低的效率!

.NET如何解决这个问题得了?正是通过将类型分成值型(value)和引用型(regerencetype),

C#中定义的值类型包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct),引用类型包括:类、数组、接口、委托、字符串等。

值型就是在栈中分配内存,在申明的同时就初始化,以确保数据不为NULL;

引用型是在堆中分配内存,初始化为null,引用型是需要GARBAGE COLLECTION来回收内存的,值型不用,超出了作用范围,系统就会自动释放!

下面就来说装箱和拆箱的定义!

装箱就是隐式的将一个值型转换为引用型对象。比如: int i=0; Syste.Object obj=i; 这个过程就是装箱!就是将i装箱!

拆箱就是将一个引用型对象转换成任意值型!比如: int i=0; System.Object obj=i; int j=(int)obj; 这个过程前2句是将i装箱,后一句是将obj拆箱!

再写个代码,看看进行了几次装拆箱! int i=0; System.Object obj=i; Console.WriteLine(i+","+(int)obj); 其中共发生了3次装箱和一次拆箱!^_^,看出来了吧?!

第一次是将i装箱,第2次是输出的时候将i转换成string类型,而string类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成string类型,装箱!

拆箱就是(int)obj,将obj拆箱!!

C#中的装箱和拆箱的相关教程结束。

相关推荐:

integer 拆箱装箱以及范围

//装箱是将一个原始数据类型赋值给相应封装类的变量。而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量。 inti1=1; inti2=1; Integerinteger1=newInteger(1); Integerinteger2=newInteger(1); //两个变量值相等 Syst...

第十七节:易混淆的概念(静态和非静态、拆箱和装箱)

一.静态和非静态 1.概念介绍   ①静态类(被static修饰)vs 普通类(没有被static修饰)   ②静态成员:被static修饰的成员,比如:静态方法、静态字段等   ③普通成员(实例成员):不被static修饰的成员,比如:普通方法、普通字段 2.运行机制   ①静态成员在程...

Integer类的装箱和拆箱到底是怎样实现的?

先解释一下装箱和拆箱: 装箱就是 自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。   下表是基本数据类型对应的包装器类型: int(4字节) Integer byte(1字节) Byte short(2字节) Short long(8字节) L...

.NET基础知识(02)-拆箱与装箱

装箱和拆箱几乎是所有面试题中必考之一,看上去简单,就往往容易被忽视。其实它一点都不简单的,一个简单的问题也可以从多个层次来解读。  常见面试题目: 1.什么是拆箱和装箱? 2.什么是箱子? 3.箱子放在哪里? 4.装箱和拆箱有什么性能影响? 5.如何避免隐身装箱? 6.箱子的基本结构? 7.装箱的过...

DataReader类型化数据读取与装箱性能研究

前言 在各种ORM框架或者SQL映射框架(例如MyBatis,SOD框架之SQL-MAP功能)中,都有将查询的结果映射为内存对象的需求,包括映射到实体类、简单类型(例如Java的POJO,.NET的POCO)的对象。在.NET中,这个过程可以通过ADO.NET的DataReader对象来读取数据,然...

C#装箱和拆箱操作实例分析

本文实例讲述了c#装箱和拆箱操作。分享给大家供大家参考,具体如下: 1.c#中的装箱 c#中的装箱就是把一个值类型隐式地转换为object类型,转换过程中采用的是值的拷贝而不是引用,这从下面的例子可以看出: usingsystem; publicclasstest { publicstaticvoi...

关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

前言 昨天晚上闲着无事,就上csdn逛了一下,突然发现一个很有意思,就点进去看了一下。 问题很精辟 inta=1; objectb=a; objectc=b; c=2; 为什么b不会变成2呢?b和c应该指向堆里面的同一个引用啊? 大神们的回答也让我深思,这里就把自己的理解写出来,如果有误,还请告知。...