志在指尖
用双手敲打未来

深入理解值类型和引用类型

C#值类型和引证类型这个概念在刚学习的时分应该就知道了。但是咱们并没有深化的去理解它。越是基础常识其实才是最有用的。对代码的优化,代码质量的提升都有帮助。经过整理本文章,对许多常识也起到了稳固的作用吧。
1,值类型
值类型有:整型,浮点型,十进制,布尔型,struct,枚举。值类型是在线程栈上分配的,值类型也称轻量级类型,一个值类型的变量就包含了值类型的值,所以它没有引证类型的指针。所有值类型的数据都无法为null,所以咱们声明时有必要赋初始值。
2,引证类型
引证类型有:class(类),interface(接口),delegate(托付),object,string,数组。引证类型是在保管堆上分配的,咱们常用的new操作符会返回一个目标的指针,也便是目标数据在内存中的地址的一个引证。引证类型的传递其实便是传递目标的指针。引证类型在创建时默认为null,也便是当前变量不指向一个有用的目标,这时如果咱们去读取null目标里的属性值时就会呈现咱们常遇见的异常:“未将目标的引证设置到目标的实例”,是不是很熟悉。所以在实践开发中咱们在操作目标的时分一定要先判别该目标是不是为null,避免异常。
值类型和引证类型咱们用的都比较多,那肯定就避免不了装箱和拆箱操作。
3,什么是装箱?
装箱便是值类型转为引证类型。
4,什么是拆箱?
拆箱便是引证类型转为值类型。这儿要注意两点:
4.1,只有被装箱过的目标才干被拆箱。
4.2,一个目标拆箱后只能复原为未装箱之前的类型。看下面代码:
1inti=5;2objectobj=i;//装箱操作3Int16j=(Int16)obj;//拆箱操作
咱们先给i做了装箱操作。然后在拆箱。但是复原的是Int16类型,这儿就会抛出异常:“指定的转换无效”。C#
5,有的同学说装箱和拆箱都影响功能,那么到底是装箱影响呢仍是拆箱影响呢仍是都影响呢?
5.1,装箱都发生了什么呢:
1,首要在保管堆中分配好内存,分配的内存量是值类型字段需求的内存量加上保管堆上需求的目标的两个额外成员(目标指针,同步块索引)需求的内存。
2,值类型的字段复制到新分配的内存中。
3,返回目标的地址,也便是目标的引证。
5.2,拆箱都发生了什么呢:
1,获取已装箱的值类型实例的指针。
2,把获取到的值复制到栈。
所以装箱时比较消耗功能的,还有可能引发一次GC操作,而拆箱仅仅一个获取指针的进程消耗资源比装箱要小的多。正因为值类型有装箱拆箱操作,所以像ArrayList这样的集合功能时非常令人担忧的,所以C#2.0呈现的泛型:List<>,减少了装箱拆箱操作。
6,使用场景
首要不止时面试的时分会经常问到使用场景这个问题,咱们平常写程序的时分也很清楚,大多情况下咱们都会使用引证类型。那什么时分会使用值类型呢?
6.1,类型不会有被承继的可能,也不会承继其他的类型。
6.2,类型的实例比较小,不会被做为办法的参数,不会被频频赋值。
本文就到此结束了。感觉自己也学到了不少东西,以后没事的时分也能够拿来看看,一起呢也期望能够帮助到需求的人,如有错误的当地还望大神点拨,持续加油!

未经允许不得转载:IT技术网站 » 深入理解值类型和引用类型
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载