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)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用“连锁店”和“ ...
随机推荐
- js中的对象知识总结
文章目录: 1. 比较两个对象是否相等 1. 比较两个对象是否相等 通过===运算符,只有在两个变量指向同一个对象时才返回true,否则返回false.要想比较两个对象中的内容是否相等,需要利用遍历对 ...
- LImax服务器框架学习--安装、使用ant工具、生成limax相关代码
一.安装ant ant 是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.在实际软件开发中,有很多地方可以用到ant. 首先现在一个ant安装压缩包, ...
- 千呼万唤始出来——uFUN开发板2.0开箱评测
前言 今年3月,我参与了面包板社区组织的第一批uFUN开发板评测活动,并有幸能获得试用机会,那是我第一次了解到uFUN这个项目及背后的故事,4月份,uFUN 2.0版本来了,收到了张工送的一块样板,后 ...
- 【BZOJ 3771】Triple
Problem Description 给出 \(n\) 个物品,第 \(i\) 个物品体积为 \(a_i\) . 对于每个体积 \(V\) ,求选出 \(3\) 个物品,体积之和为 \(V\) 的方 ...
- springcloud Config 入门,带视频
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...
- 学习 C#,从 Hello world 开始吧
目录 Hello world 创建.编辑.编译和运行 C# 源代码 使用 .NET Core 命令行接口 (CLI) 工具 使用 Visual Studio 创建项目 编译和执行 总结 C#(读作 & ...
- Ligg.EasyWinApp-100-Ligg.EasyWinForm:一款Winform应用编程框架和UI库介绍
本项目是一个Winform应用编程框架和UI库.通过这个该框架,不需任何代码,通过XML配置文件,搭建任意复杂的Windows应用界面,以类似Execel公式的方式实现基本的过程控制(赋值.条 ...
- 松软科技web课堂:随机Math.random()
Math.random() 返回 0(包括) 至 1(不包括) 之间的随机数: 实例 Math.random(); // 返回随机数 JavaScript 随机整数 Math.random() 与 M ...
- Cesium专栏-淹没分析(附源码下载)
Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精度,渲染质量以 ...
- Android View的background和padding
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/181 最近在做一个需求,是对im聊天消息设置气泡背景,之前 ...