C#学习笔记之值类型与引用类型

1.值类型与引用类型

1.1 深层区别

值类型与引用类型有不同的内存分布,这导致了不同的内存管理机制:

  • 值类型由OS负责内存管理
  • 引用类型由垃圾回收器(GC)负责内存管理

内存管理:指的是对内存的分配与释放的管理

1.2 值类型与引用类型的嵌套使用

1.2.1 引用类型嵌套值类型

eg 1.类的字段值是值类型,它是在托管堆上的。

eg 2.局部变量(如方法中的变量),是在堆栈上的。

1.2.2 值类型嵌套引用类型

堆栈保存了引用,托管堆保存了实际的数据。

1.3 小结

  • 由于值类型由OS直接对内存进行管理,而引用类型需要使用托管堆对内存进行管理,所以值类型在性能上有天然的优势;
  • 引用类型可以具有继承性(类,接口);
  • 使用引用类型进行传参时会改变变量本身(string除外,因为string具有不变形,赋值后不可改变。可以理解为const修饰符修饰的变量?);
  • 值类型实例总会被分配到它声明的地方,引用类型总被分配到托管堆上。

2.装箱与拆箱

2.1 类型转换的几种方法

  • 隐式的类型转换(装箱);
  • 显示转换
  • is和as运算符进行安全的类型转换
  • .NET类库中的Conver进行类型转换

2.2 什么是装箱与拆箱

graph TD;
值类型-->1装箱;1装箱-->引用类型;引用类型-->2拆箱;2拆箱-->值类型;

值类型装箱成为引用类型,引用类型拆箱成为值类型。

装箱过程:在托管堆生成一份堆栈中值类型对象的备份。

  1. 内存分配:在托管堆中分配放置赋值的实际数据的空间;
  2. 完成实际数据的分配:将值类型实例的数据复制到新分配的空间中;
  3. 地址返回:将托管堆中的对象地址返回给引用类型变量。

拆箱过程:将托管堆中生成的引用类型所指向的已装箱的值类型数据复制到值类型对象的过程。

  1. 检查实例:是否为null,否则继续检查变量是否和拆箱后的类型是否为同一类型,是继续;
  2. 地址返回:返回已经装箱变量的实际数据部分地址;
  3. 数据复制:将托管堆中的数据复制到堆栈中。

2.3 一个装箱与拆箱的例子

int i = 3;
object o = i; // 装箱
int y = (int)o; // 拆箱

2.4 装箱与拆箱带来的问题

  • 性能问题

    • 中间带有复制操作,会降低性能
    • 产生中间对象,造成了GC(垃圾回收器)的负担
  • 会产生隐藏的bug

2.5 小结

  • 值类型装箱成为引用类型,引用类型拆箱成为装箱前的值类型
  • 装箱会在托管堆生成堆栈中值类型对象的备份,根据这个备份可以完成拆箱
  • 过多使用装箱与拆箱操作会带来性能问题与产生一些难以排除的bug

C#学习笔记之值类型与引用类型的更多相关文章

  1. 【C#】学习笔记(4) 值类型和引用类型相关(Null相关)

    Reference and Value Types Value Types(值类型): struct(结构体) 独立的实例或者是拷贝 值的改变不会影响其它拷贝 值就是它所代表的信息 没有引用,所以不可 ...

  2. Emit学习(2) - IL - 值类型和引用类型(补)

    上周末回家去享受生活了, 工作是为了更好的生活嘛, 所以我把生活, 工作分的比较开. 这几天不是很忙, 在学习工作技能的同时, 发点博文, 也算是做一个学习笔记 上篇中, 贴出的地址里面那位哥, 也有 ...

  3. 学习记录 java 值类型和引用类型的知识

    1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...

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

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

  5. C#学习笔记(三):值类型、引用类型及参数传递

    值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚 ...

  6. Net基础篇_学习笔记_第十二天_面向对象继承(命名空间 、值类型和引用类型)

    命名空间可以认为类是属于命名空间的. 解决类的重名问题,可以看做类的“文件夹”如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间.1).用鼠标去点2).alt+shift+F ...

  7. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

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

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

  9. .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等

    1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...

随机推荐

  1. 实验吧——隐写术之复杂的QR_code

    好久没有更新隐写术方面的题目了,对不起各位小可爱,今天我会多多更新几篇文章,来慰藉你们! 永远爱你们的 ---------新宝宝 1:复杂的QR_code 解题思路:保存图片之后使用在线解码工具,并没 ...

  2. Netbeans IDE 安装Emmet插件并解决Emmet插件无效果问题

    Emmet是许多流行文本编辑器的插件,它极大地改进了HTML和CSS工作流程:在Netbeans IDE 下安装Emmet:1.打开Netbeans IDE编辑器,选择 工具—>插件选项,在 可 ...

  3. css节点选择器

    基础选择器 基础选择器是选择器的所有选择器的基本组成元素,也最简单,包含如下5个类别: ID选择器 标签选择器 类选择器 属性选择器:类选择器算是一个特殊的属性选择器,通用的属性选择器举例如下: #c ...

  4. 服务部署到Swarm Cluster中

    对于已存在的镜像,将其部署到服务器中并开始对外服务,便是它的职责,而我们要做的便是帮助它完成职责,前两个应用环节都已产生了相应的镜像,在这一环节,将完成服务部署到容器集群的工作,对于这一过程,实际执行 ...

  5. Python调用ansible API系列(三)带有callback的执行adhoc和playbook

    在第二篇文章中虽然可以执行adhoc和playbook但是执行结果的输出并不是特别直观,虽然没有报错但是到底什么结果其实你是不知道的尤其是在执行adhoc的时候,这时候我们要利用callback来设置 ...

  6. Asp.Net Core 轻松学-多线程之Task(补充)

    前言     在上一章 Asp.Net Core 轻松学-多线程之Task快速上手 文章中,介绍了使用Task的各种常用场景,但是感觉有部分内容还没有完善,在这里补充一下. 1. 任务的等待 在使用 ...

  7. DSAPI 提取中间文本(字符串)

    提取中间文本(源文本 As String, 前导文本 As String, 结束文本 As String, Optional 移除文本 As String = "", Option ...

  8. OGG-02803 Encountered a Data Guard role transition

    告警提示其实已经很明显了OGG-02803 Encountered a Data Guard role transition. Alter Extract to SCN 15,756,246 and ...

  9. windows系统库

    内部组件 这些程序库文件通常不会被程序直接使用,不过它们却是用来实现其他程序库功能的重要程序库. Hal.dll Windows系统的硬件抽象层就是由Hal.dll实现[1].HAL提供很多函数,而这 ...

  10. Postman 安装

    前言 安装前的准备: 1.Chrome 浏览器的扩展插件来进行的安装,并非单独应用程序. 2.电脑上已经安装了 Chrome 浏览器 3.本文章适用操作系统  window7 一,非官方安装 个人不建 ...