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)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用“连锁店”和“ ...
随机推荐
- 1.1 Spring 概述
1.1 Spring 概述 1.1.1 Spring 的简史 第一阶段:xml配置 Spring 1.x时代使用xml配置Bean 第二阶段:注解配置 Spring2.x Spring 提供了声明B ...
- 更小的GIS数据格式-Geobuf
背景 我们经常遇到直接传输gis数据到前端展示的时候,有时候数据量一稍微多点,传输速度就减慢,因为我们用于传输的json格式比较大. Geobuf介绍 Geobuf是一种用于地理数据的紧凑二进制编码. ...
- Scrum Meeting - 第六周【Alpha阶段】
每日任务内容: 本次会议为第六次Scrum Meeting会议 本次会议项目经理召开时间为20:00,在北区男生宿舍楼召开,召开时长约15分钟,探讨了本周选课网站编写的后续工作. 小组成员 本周任务 ...
- macbook无法下载软件问题解决
今天新买了一台MacBook Pro,但是发现无法下载软件,在App Store中一直转圈圈. 方法:修改网络DNS为114.114.114.114和8.8.8.8,即可解决.
- 同步IO, 异步IO的理解
1. 什么是IO? 在计算机中无时无刻不存在着对数据的访问和读取(数据都存储在物理的媒介上,例如寄存器,高速缓存,内存,磁盘,网卡等等),这些操作被称为IO. 2. 阻塞IO (1)当用户线程发起IO ...
- shiro实战(1)--web
目录结构: 数据库结构: 一·web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- ECMAScript 5 特性
ECMAScript 5 也称为 ES5 和 ECMAScript 2009. ECMAScript 5 特性 这些是 2009 年发布的新特性: "use strict" 指令 ...
- Python中通过csv的writerow输出的内容有多余的空行两种方法
第一种方法 如下生成的csv文件会有多个空行 import csv #python2可以用file替代open with open("test.csv","w" ...
- 松软科技web课堂:JavaScript If...Else 语句
条件语句用于基于不同条件执行不同的动作. 条件语句 在您写代码时,经常会需要基于不同判断执行不同的动作. 您可以在代码中使用条件语句来实现这一点. 在 JavaScript 中,我们可使用如下条件语句 ...
- [document.cookie]为什么cookie不在window下的呢.奇怪了[未完待续]
什么是cookie,怎么就叫cookis,它能干嘛 我猜吧,就是登录页面的时候传值,二次登录的时候可以给你说句'hello xxx'; 下面这堆比较啰嗦,随意看吧 //cookie 用户储存在用户本地 ...