C#学习笔记之值类型与引用类型
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 什么是装箱与拆箱
值类型-->1装箱;1装箱-->引用类型;引用类型-->2拆箱;2拆箱-->值类型;
值类型装箱成为引用类型,引用类型拆箱成为值类型。
装箱过程:在托管堆生成一份堆栈中值类型对象的备份。
- 内存分配:在托管堆中分配放置赋值的实际数据的空间;
- 完成实际数据的分配:将值类型实例的数据复制到新分配的空间中;
- 地址返回:将托管堆中的对象地址返回给引用类型变量。
拆箱过程:将托管堆中生成的引用类型所指向的已装箱的值类型数据复制到值类型对象的过程。
- 检查实例:是否为null,否则继续检查变量是否和拆箱后的类型是否为同一类型,是继续;
- 地址返回:返回已经装箱变量的实际数据部分地址;
- 数据复制:将托管堆中的数据复制到堆栈中。
2.3 一个装箱与拆箱的例子
int i = 3;
object o = i; // 装箱
int y = (int)o; // 拆箱
2.4 装箱与拆箱带来的问题
- 性能问题
- 中间带有复制操作,会降低性能
- 产生中间对象,造成了GC(垃圾回收器)的负担
- 会产生隐藏的bug
2.5 小结
- 值类型装箱成为引用类型,引用类型拆箱成为装箱前的值类型
- 装箱会在托管堆生成堆栈中值类型对象的备份,根据这个备份可以完成拆箱
- 过多使用装箱与拆箱操作会带来性能问题与产生一些难以排除的bug
C#学习笔记之值类型与引用类型的更多相关文章
- 【C#】学习笔记(4) 值类型和引用类型相关(Null相关)
Reference and Value Types Value Types(值类型): struct(结构体) 独立的实例或者是拷贝 值的改变不会影响其它拷贝 值就是它所代表的信息 没有引用,所以不可 ...
- Emit学习(2) - IL - 值类型和引用类型(补)
上周末回家去享受生活了, 工作是为了更好的生活嘛, 所以我把生活, 工作分的比较开. 这几天不是很忙, 在学习工作技能的同时, 发点博文, 也算是做一个学习笔记 上篇中, 贴出的地址里面那位哥, 也有 ...
- 学习记录 java 值类型和引用类型的知识
1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- C#学习笔记(三):值类型、引用类型及参数传递
值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚 ...
- Net基础篇_学习笔记_第十二天_面向对象继承(命名空间 、值类型和引用类型)
命名空间可以认为类是属于命名空间的. 解决类的重名问题,可以看做类的“文件夹”如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间.1).用鼠标去点2).alt+shift+F ...
- 《CLR via C#》读书笔记--基元类型、引用类型和值类型
编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...
- c# 值类型和引用类型 笔记
参考以下博文,我这里只是笔记一下,原文会更加详细 c#基础系列1---深入理解值类型和引用类型 堆栈和托管堆c# 值类型和引用类型 红色表示——“这啥?”(真实1个问题引出3个问题) CLR支持的两种 ...
- .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等
1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...
随机推荐
- CentOS7解决firefox无法启用ibus中文输入的问题
最近换电脑,要换掉使用了6年的旧环境,开始折腾重装系统: 下了minimal版本的CentOS7.4,然后开始一点点装想用的东西,多少找到一点十年前折腾LFS的感觉:然后竟然被输入法拌住了半天,事后回 ...
- WebGL展示3D房屋内景
原文地址:WebGL展示3D房屋内景 由于生活和工作上的原因,从年前开始一直到处奔波,没有太多的时间去关注和学习WebGL图形学相关的技术, 不过陆陆续续都有学习使用blender进行3D建模 ...
- 想在京津冀地区找个UI&UE的工作靠啥?看看这篇博客
文章目的 本篇文章针对京津冀计算机专业应届毕业生,求职UI相关行业,提供数据参考. 本篇文章试用对象 UI相关培训机构 计算机设计相关培训机构 高职专科类学院计算机相关专业 就业参考网站 智联招聘 拉 ...
- 介绍几款 Python 类型检查工具
近日,微软在 Github 上开源了一个 Python 静态类型检查工具:pyright ,引起了社区内的多方关注. 微软在开源项目上的参与力度是越来越大了,不说收购 Github 这种大的战略野心, ...
- php 通过header下载中文文件名 压缩包损坏或文件不存在的问题
开发中大家都是使用的utf8编码,昨天遇到一个奇坑,本是一件很小的问题,解决也浪费了个吧小时.废话不多说,植入正题: 文件下载方式:通过header二进制流文件下载需求: 文件上传保留文件名不变数据字 ...
- spring boot 2.0 Feign的客户端
1.pom.xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId ...
- jQuery实现全选、反选和不选功能
HTML 我们的页面上有一个歌曲列表,列出多行歌曲名称,并匹配复选框供用户选择,并且在列表下方有一排操作按钮. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <ul id=&q ...
- 在keil中添加stc系列单片机型号(模型)方法
1.下载安装stc-isp烧录软件: 官网:http://www.gxwmcu.com/ 2.打开使用stc-isp软件,并导入stc官方器件库: 注意:一定要找到包含有C51和UV4的文件夹 3.显 ...
- windows手动去重 通配符
在下载文件时,如果遇到重复文件,windows的默认做法时 文件名(数字) 这样的方式重命名的. 那么我们在排除重复文件时,可以使用 windows文件浏览器提供的查找功能, 用通配符 ~=& ...
- Jmeter入门篇
下载Jmeter:http://jmeter.apache.org/download_jmeter.cgi 安装后双击bin目录下的jmeter.bat文件启动jmeter 先看下怎么创建一个测试计划 ...