C#值类型和引用类型这个概念在刚学习的时候应该就知道了。但是我们并没有深入的去理解它。越是基础知识其实才是最有用的。对代码的优化,代码质量的提升都有帮助。通过整理本文章,对很多知识也起到了巩固的作用吧。

1,值类型

  值类型有:整型,浮点型,十进制,布尔型,struct,枚举。值类型是在线程栈上分配的,值类型也称轻量级类型,一个值类型的变量就包含了值类型的值,所以它没有引用类型的指针。所有值类型的数据都无法为null,所以我们声明时必须赋初始值。

2,引用类型

  引用类型有:class(类),interface(接口),delegate(委托),object,string,数组。​​​引用类型是在托管堆上分配的,我们常用的new操作符会返回一个对象的指针,也就是对象数据在内存中的地址的一个引用。引用类型的传递其实就是传递对象的指针。引用类型在创建时默认为null,也就是当前变量不指向一个有效的对象,这时如果我们去读取null对象里的属性值时就会出现我们常遇见的异常:“未将对象的引用设置到对象的实例”,是不是很熟悉。所以在实际开发中我们在操作对象的时候一定要先判断该对象是不是为null,避免异常。

值类型和引用类型我们用的都比较多,那肯定就避免不了装箱和拆箱操作。

3,什么是装箱?

装箱就是值类型转为引用类型。

4,什么是拆箱?

拆箱就是引用类型转为值类型。这里要注意两点:

  4.1,只有被装箱过的对象才能被拆箱

  4.2,一个对象拆箱后只能还原为未装箱之前的类型。看下面代码:

 int i = ;
object obj = i;//装箱操作
Int16 j = (Int16)obj;//拆箱操作

我们先给i做了装箱操作。然后在拆箱。但是还原的是Int16类型,这里就会抛出异常:“指定的转换无效”。

5,有的同学说装箱和拆箱都影响性能,那么到底是装箱影响呢还是拆箱影响呢还是都影响呢?

5.1,装箱都发生了什么呢

  1,首先在托管堆中分配好内存,分配的内存量是值类型字段需要的内存量加上托管堆上需要的对象的两个额外成员(对象指针,同步块索引)需要的内存。

  2,值类型的字段复制到新分配的内存中。

  3,返回对象的地址,也就是对象的引用。

5.2,拆箱都发生了什么呢

  1,获取已装箱的值类型实例的指针。

  2,把获取到的值复制到栈。

所以装箱时比较耗费性能的,还有可能引发一次GC操作,而拆箱只是一个获取指针的过程耗费资源比装箱要小的多。正因为值类型有装箱拆箱操作,所以像ArrayList这样的集合性能时非常令人担忧的,所以C#2.0出现的泛型:List<>​,减少了装箱拆箱操作。

6,应用场景

首先不止时面试的时候会经常问到应用场景这个问题,我们平时写程序的时候也很清楚,大多情况下我们都会使用引用类型。那什么时候会使用值类型呢?

  6.1,类型不会有被继承的可能,也不会继承其他的类型。

  6.2,类型的实例比较小,不会被做为方法的参数,不会被频繁赋值。

本文就到此结束了。感觉自己也学到了不少东西,以后没事的时候也可以拿来看看,同时呢也希望可以帮助到需要的人,如有错误的地方还望大神指点,继续加油!

原文来自:C#基础知识1-深入理解值类型和引用类型-曾亚平个人博客

C#基础知识1-深入理解值类型和引用类型的更多相关文章

  1. C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)

    前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...

  2. c#基础系列1---深入理解值类型和引用类型

    "大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...

  3. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  4. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  5. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  6. c# 值类型和引用类型 笔记

    参考以下博文,我这里只是笔记一下,原文会更加详细 c#基础系列1---深入理解值类型和引用类型 堆栈和托管堆c# 值类型和引用类型 红色表示——“这啥?”(真实1个问题引出3个问题) CLR支持的两种 ...

  7. 理解C#值类型和引用类型

    网上偶尔浏览到这一篇文章,还不错就修改了下分享给大家. 工作许久了,可是对C#值类型和C#引用类型却一直无法很好的理解.这两天花了不少时间查找资料,看文章,终于有所收获,在此将自己理解整理出来,方便日 ...

  8. 从CLR角度来看值类型与引用类型

    前言 本文中大部分示例代码来自于<CLR via C# Edition3>,并在此之上加以总结和简化,文中只是重点介绍几个比较有共性的问题,对一些细节不会做过深入的讲解. 前几天一直忙着翻 ...

  9. js值类型与引用类型

    JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用“连锁店”和“ ...

随机推荐

  1. .netcore实现一个读写分离的数据库访问中间件

    在实际业务系统中,当单个数据库不能承载负载压力的时候,一般我们采用数据库读写分离的方式来分担数据库负载.主库承担写以及事务操作,从库承担读操作. 为了支持多种数据库我们先定义一个数据类型字典.key为 ...

  2. VS激活(Visual Studio)

    以下是Visual Studio各个版本的激活密匙: Visual Studio Enterprise 企业版: BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio ...

  3. 设置POP3/SMTP协议 手机绑定邮箱

    例如设置企业邮箱 一.设置POP3/SMTP协议,意思是代收邮件致本地POP3接收邮件服务器:pop.qiye.qq.comSMTP发送邮件服务器:smtp.qiye.qq.com二.设置IMAP/S ...

  4. 工具类Arrays.asList()方法把数组转换成集合

    工具类Arrays.asList()方法把数组转换成集合 不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException() 问 ...

  5. IT兄弟连 HTML5教程 CSS3属性特效 盒模型阴影

    除了为文字添加阴影,我们还可以为盒模型添加阴影.盒模型阴影的属性名称为box-shadow,此属性与text-shadow一样有4个值,前两个值分别表示水平方向位移距离和垂直方向的位移距离,第三个值表 ...

  6. 从properties中读取配置创建对象

    主要做两个事,从properties配置文件中读取信息,通过反射创建对象 思路主要有两种,遍历得到的属性集合,然后设置类的属性 遍历类的属性集合,从配置文件中读取(不推荐,因为类的属性有多样化,会报错 ...

  7. Java对象 POJO和JavaBean的区别

    转载自https://www.jianshu.com/p/224489dfdec8 这篇博客很通俗易懂的讲明白了什么是POJO,对于刚开始学开发做java项目的菜鸟来说,很有帮助,网课老师是不会讲这些 ...

  8. Xshel和Xftp免费版

    打开:https://www.netsarang.com/zh/free-for-home-school/ 然后填写自己的姓名与真实的邮箱即可.提交成功后,会将下载链接发送至刚才填写的邮箱里,发送的下 ...

  9. js 淡入淡出的tab选项卡

    代码如下 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF- ...

  10. 一个有意思的自我介绍PPT快闪

    模版来源:http://ppt.dede58.com/peixunyanjiang/27066.html