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. 《Java基础知识》Java多态和动态绑定

    在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例. 请读者先看一段代码: public class Demo { public static void main(String[] ar ...

  2. Django3.0 异步通信初体验(小结)

    2019年12月2日,Django终于正式发布了3.0版本.怀着无比的期待,我们来尝试一下吧! (附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/e ...

  3. UiPath Platform注册 登录 及 访问 Orchestrator

    相关步骤: 1.https://platform.uipath.com/portal_/cloudrpa 注册 及 登录 2. Login后 通过Services 连接 访问 UiPath Orche ...

  4. Android 项目优化(三):MultiDex 优化

    在整理MultiDex优化之前,先了解一下Apk的编译流程,这样有助于后面针对MultiDex优化. 一.Apk 编译流程 Android Studio 按下编译按钮后发生了什么? 1. 打包资源文件 ...

  5. EVERSPIN非易失性存储器具吸引力嵌入式技术

    相关研究指出,如果以嵌入式MRAM取代微控制器中的eFlash和SRAM,可节省高达90%的功耗:如果采用单一晶体管MRAM取代六个晶体管SRAM,则可实现更高的位元密度和更小的芯片尺寸,这些功率与面 ...

  6. 《Hands-On System Programming with Go》之写文件的代码模板

    使用了buffer,这个神奇东东. var w io.WriteCloser // initialise writer defer w.Close() b := bufio.NewWriter(w) ...

  7. 如何从Mac删除恶意广告软件,摆脱那些通过弹出广告或工具栏入侵Mac的恶意软件

    厌倦了那些利用弹出式广告和工具栏之类入侵Mac的恶意软件?该如何摆脱Mac上的恶意软件呢?今天小编为大家带来两种方法从Mac 删除广告软件,甚至阻止它到达您的Mac,感兴趣的朋友一起来看看吧! 方法一 ...

  8. uiautomatorviewer提示Unable to connect to adb. Check if adb is installed correctly解决方法

    转自:https://www.jianshu.com/p/c8581a70d1bc 解决方案: 1.打开  "E:\android-sdk_r24.4.1-windows\android-s ...

  9. 系统优化——建立linux回收站机制

    前言: linux系统下的rm是不可挽回的,命令设计本身没有问题,问题在于我们通常非常的自信,执行的时候喜欢rm -rf,这样的话就非常危险了,在执行的时候如果执行命令不对,甚至是执行的目录不对,那么 ...

  10. 如何安装 IntelliJ IDEA 最新版本——详细教程

    IntelliJ IDEA 简称 IDEA,被业界公认为最好的 Java 集成开发工具,尤其在智能代码助手.代码自动提示.代码重构.代码版本管理(Git.SVN.Maven).单元测试.代码分析等方面 ...