ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

引用类型、值类型 装箱与拆箱

2021-09-26 18:00:29  阅读:186  来源: 互联网

标签:拆箱 10 aq bq 类型 cq 装箱 引用


1.一个面向对象的语言为什么要有值类型

值类型与引用类型基于oop思想发展而来。它抛弃了所有类型都是对象(java)设计思路,这种设计思路看上去简单暴力,但是对编译器的性能增加了很大瓶颈。C#将负责计算的类型剥离出来设置为值类型,将负责抽象化的设置为引用类型。与C++中单纯的内置类型不同,C#中的值类型由于专门负责处理计算,还可以拥有构造器、终结器、方法等一系列类中才能有的成员,一切都是为了处理计算服务。

2.从内部来看值类型与引用类型

值类型储存在栈中。引用类型分为两部分储存,一部分在栈中存变量名和地址,另一部分在堆中存成员。string虽然是引用类型,但是它却存在栈中。

堆中的部分是托管的(类似JVM),栈中的遵守先进后出。

值类型也是继承自ValueType(继承自Object),但是它覆盖了object中的方法,编译器会对继承自ValueType的对象特殊处理。

3. 装箱

由于值类型实际上也是继承自Object,所以能隐式转换为Object,这就导致了装箱的问题出现。

int aq = 10;
object bq = aq;//装箱
int cq = (int)bq;//拆箱

Console.WriteLine("aq={0},bq={1},cq={2}", aq, bq, cq);
//aq=10,bq=10,cq=10
aq=15;
Console.WriteLine("aq={0},bq={1},cq={2}", aq, bq, cq);
//aq=15,bq=10,cq=10
Console.WriteLine(bq.GetType().Name);
//Int32

由上可知,在这个隐式转换的过程中,转换后的object和之前的值类型没有关系了。这是因为在转换的时候,编译器会在堆上创建一个引用类型,类型名也是Int32,内部property装的是aq的值。
拆箱的时候又会在栈上创建一个值类型,将property的值赋过去。

频繁的在栈、堆上创建对象是很浪费空间时间,所以要避免装箱拆箱的情况出现,尤其是循环和递归函数中。值类型与引用类型的传递应使用方法或泛型。

标签:拆箱,10,aq,bq,类型,cq,装箱,引用
来源: https://www.cnblogs.com/none323/p/15098083.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有