C#基础知识1-深入理解值类型和引用类型
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-深入理解值类型和引用类型的更多相关文章
- C#基础知识系列二(值类型和引用类型、可空类型、堆和栈、装箱和拆箱)
前言 之前对几个没什么理解,只是简单的用过可空类型,也是知道怎么用,至于为什么,还真不太清楚,通过整理本文章学到了很多知识,也许对于以后的各种代码优化都有好处. 本文的重点就是:值类型直接存储其值,引 ...
- c#基础系列1---深入理解值类型和引用类型
"大菜":源于自己刚踏入猿途混沌拾起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 不知不觉已经踏入坑已10余年之多,对于c#多多少少有一点自己的认识, ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)
一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...
- C#学习笔记(基础知识回顾)之值传递和引用传递
一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...
- c# 值类型和引用类型 笔记
参考以下博文,我这里只是笔记一下,原文会更加详细 c#基础系列1---深入理解值类型和引用类型 堆栈和托管堆c# 值类型和引用类型 红色表示——“这啥?”(真实1个问题引出3个问题) CLR支持的两种 ...
- 理解C#值类型和引用类型
网上偶尔浏览到这一篇文章,还不错就修改了下分享给大家. 工作许久了,可是对C#值类型和C#引用类型却一直无法很好的理解.这两天花了不少时间查找资料,看文章,终于有所收获,在此将自己理解整理出来,方便日 ...
- 从CLR角度来看值类型与引用类型
前言 本文中大部分示例代码来自于<CLR via C# Edition3>,并在此之上加以总结和简化,文中只是重点介绍几个比较有共性的问题,对一些细节不会做过深入的讲解. 前几天一直忙着翻 ...
- js值类型与引用类型
JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用“连锁店”和“ ...
随机推荐
- 2016/09/21 context.getConfiguration().get()
查看api:http://hadoop.apache.org/docs/stable/api/ public String get(String name) Get the value of the ...
- 《Java基础知识》一维,二维数组的申明和使用
为什么要使用数组: 因为不使用数组计算多个变量的时候太繁琐,不利于数据的处理. -------- 数组也是一个变量,是存储一组相同类型的变量 声明一个变量就是在内存中划出一块合适的空间 声明一个数 ...
- java设计模式(二)单例模式,一生只爱一人,只争一朝一夕
单例模式:保证一个类在内存中的对象唯一,有且仅能实例化一次.(如多个代码块需要读取配置文件,or开启事务,orjdbc读取数据源就是个经典例子)参考:吟啸且徐行 实现步骤: 私有构造方法.保证唯一的 ...
- 使用littlefs-fuse在PC端调试littlefs文件系统
背景 littlefs是arm面向嵌入式设备推出的一款掉电安全的小型文件系统,具有抗掉电,动态磨损均衡,RAM/ROM需求少等特点,具体介绍可见 https://github.com/ARMmbed/ ...
- 【Python进阶】来谈谈几个常用的内置函数
匿名函数(lambda表达式) 在Python中,函数可以算的上是“一等公民”了,我们先回顾下函数的优点: 减少代码重复量 模块化代码 但是我们有没有想过,如果我们需要一个函数,比较简短,而且只需要使 ...
- 剑指offer题解(Java版)
剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
- Mac 停止redis服务
停止redis服务: redis-cli shutdown 开始redis服务: redis-server
- 管道及 I/O 重定向
I/O重定向 I/O Redirection 标准输入.标准输出.标准错误输出重定向及综合案例输入重定向及结合案例 标准输入.标准输出.标准错误 file descriptors (FD,文件描述符 ...
- VS2019 开发Django(五)------createsuperuser
导航:VS2019开发Django系列 上篇我们已经把LazyOrders中用到的C#的实体转成了Django中的Entity,并且已经迁移数据库成功,那么,今天继续介绍Django中内置的数据库操作 ...
- Java安装JDK
因为Java程序必须运行在JVM之上,所以,我们第一件事情就是安装JDK. 搜索JDK 13,确保从Oracle的官网下载最新的稳定版JDK: 1.选择JDK版本 2.同意协议,点击合适系统平台下载 ...