装箱 就是把“值类型”转换成“引用类型”(Object);
拆箱 就是把“引用类型”转换成“值类型”;
//装箱 boxingint i = 3 ; //分配在栈上object o = i ;//隐式装箱操作,int i 在堆上object b = (object)i ; //显示装箱操作//拆箱 unboxingint j = (int) o ;//显示拆箱(将对象o拆箱为int类型)int k = b ;//error!!, 不能隐式拆箱 |
拆箱 的操作包括
1,检查对象实例,以却确保它是给定值类型的装箱值。
2,将该值从实例复制到值类型变量中。
下面来看看这个例子:
|
1
2
3
|
int i=0;System.Object obj=i;Console.WriteLine(i+","+(int)obj); |
其中共发生了3次装箱和一次拆箱!^_^,看出来了吧?!
第一次是将i装箱,第2次是输出的时候将i转换成string类型,而string类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成string类型,装箱!
拆箱就是(int)obj,将obj拆箱!!
https://blog.csdn.net/wuan584974722/article/details/81902904
一,c#中的值类型和引用类型
众所周知在c#中有两种基本类型,它们分别是值类型和引用类型;而每种类型都可以细分为如下类型:

1 class SomRef
2 {
3 public int x;
4 }
5 struct SomeVal {
6
7 public int x;
8
9 }
10
11 class Program {
12
13 static void ValueTypeDemo() {
14
15 SomRef r1 = new SomRef();//在堆上分配
16
17 SomeVal v1 = new SomeVal();//在栈上分配
18
19 r1.x = 5;//提领指针
20
21 v1.x = 5;//在栈上修改
22
23 SomRef r2 = r1;//只复制引用(指针)
24
25 SomeVal v2 = v1;//在栈上分配并复制成员
26
27 }
28
29 }

二,值类型的装箱和拆箱操作
1 int i = 5; 2 3 object o = i; 4 5 int j = (int)o; 6 7 Int16 y=(Int16)o;
1 static void Main(string[] args)
2 {
3
4 int v = 5;
5
6 object o = v;
7
8 v = 123;
9
10 Console.WriteLine(v+","+(int)o);
11
12 }
通过上面的分析我们已经知道了,装箱和拆箱/复制操作会对应用程序的速度和内存消耗产生不利的影响(例如消耗内存,增加垃圾回收次数,复制操作),所以我们应该注意编译器在什么时候会生成代码来自动这些操作,并尝试手写这些代码,尽量避免自动生成代码的情况。
你能一眼从上面的代码中看出进行了几次装箱操作吗?正取答案是3次。分别进行了哪三次呢,我们来看一下:第一次object o=v;第二次在执行 Console.WriteLine(v+","+(int)o);时将v进行装箱,然后对o进行拆箱后又装箱。也就是说装箱过程总是在我们不经意的时候进行的,所以只有我们充分了解了装箱的内部机制,才能有效的避免装箱操作,从而提高应用程序的性能。所以对上面的代码进行如下修改可以减少装箱次数,从而提高性能:
1 static void Main(string[] args)
2 {
3
4 int v = 5;
5
6 object o = v;
7
8 v = 123;
9
10 Console.WriteLine(v.ToString() + "," + ((int)o).ToString());//((int)o).ToString()代码本身没有任何意义,只为演示装箱和拆箱操作
11
12 }
三,泛型的出现(本节只简单介绍泛型对装箱和拆箱所起的作用,关于泛型的具体细节请参考下一篇文章)
1 static void Main(string[] args)
2 {
3 ArrayList dateList = new ArrayList {DateTime.Now};
4
5 IList<DateTime> dateT = new List<DateTime> {
6 DateTime.Now
7 };
8
9 }
使用ArrayList时,每添加一个时间都会进行一次装箱操作,而使用List<DateTime>时就不会进行装箱操作,从而提高应用程序的性能。
Queue<T>;
Stack<T>;
List<T>;
Dictionary<Tkey,Tvalue>;
HashSet<T>;
在使用这些集合之前我们必须要理解每一种集合的工作原理(没事自己可以实现一下),了解每一种集合的适合场合,这样才能写出高效的代码。
四,在设计时如何选择类和结构体
在面试的时候,我们经常被问的一个问题(还有另外一个问题,如何选择抽象类和接口,下次我会单独聊聊这个问题),下面我们来聊聊在设计时应该如何选择结构体和类
都说程序是一门注重实践的学科,但是也只有熟悉理解了这些概论的东西,才能在实践时写出优秀的代码,有不对或者不合理的地方欢迎在下面讨论;
什么是值类型,什么是引用类型
概念:值类型直接存储其值,而引用类型存储对其值的引用。部署:托管堆上部署了所有引用类型。
引用类型:基类为Objcet
值类型:均隐式派生自System.ValueType:
|
值类型: |
byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。 |
|
引用类型: |
string 和 class统称为引用类型。 |
本文转自:https://www.cnblogs.com/zjtao/p/11345442.html
原文:https://www.cnblogs.com/YourDirection/p/12761918.html