c# 值类型和引用类型 笔记
参考以下博文,我这里只是笔记一下,原文会更加详细
值类型和引用类型
红色表示——“这啥?”(真实1个问题引出3个问题)
CLR支持的两种类型

引用类型:
引用类型从托管堆上分配,new操作符会返回对象的指针——指向对象数据的内存位置的一个引用,引用类型传递的是对象的指针(string特殊)。引用类型的变量都需要一次堆内存的分配。
值类型:
值类型一般在线程栈上分配,一个值类型变量包含了其实例的值,没有引用指针。

相同点:
都是System.Object的子类。
值类型也可以继承接口。
不同点:
1、 值类型分配在堆栈上,引用类型在托管堆上分配;
如果一个引用类型的某个属性是值类型,这个值类型也分配在托管堆上。
2、 所有的值类型都是隐式密封的(sealed),不能继承。

3、 值类型的赋值逐字段的复制,频繁赋值也会造成性能上的压力;引用类型的赋值只是指针传递。
4、 引用类型额外有类型对象指针和同步块索引。
5、 值类型继承自System.ValueType;引用类型继承自System.Object,System.ValueType也继承自System.Object。System.ValueType重写了Equals和GetHashCode方法
性能:
值类型分配在栈上,在GC控制外,不会对GC造成压力;

引用类型分配在堆中,会影响到GC,每一次到堆的内存分配都有可能进行一次垃圾收集操作。
装箱拆箱:
装箱是将值类型转化为引用类型,拆箱则是将引用类型转化为值类型。
装箱:
1、 在托管堆中分配好了内存,分配的内存量为值类型的各个字段需要的内存量加上托管上对象的两个额外成员(类型对象指针,同步块索引)需要的内存量
2、 值类型的字段复制到新分配的堆内存中。
3、 返回对象的地址,这个地址就是这个对象的引用。
拆箱:
1、 获取已经装箱的值类型实例的指针。
2、 把获取到的值复制到栈。
(拆箱只能还原为原先未装箱之前的类型)
装箱比较耗费性能,还可能引起GC操作
c# 值类型和引用类型 笔记的更多相关文章
- C#学习笔记之值类型与引用类型
[TOC] C#学习笔记之值类型与引用类型 1.值类型与引用类型 1.1 深层区别 值类型与引用类型有不同的内存分布,这导致了不同的内存管理机制: 值类型由OS负责内存管理 引用类型由垃圾回收器(GC ...
- C#学习笔记(基础知识回顾)之值类型和引用类型
一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...
- C#学习笔记(三):值类型、引用类型及参数传递
值类型和引用类型简介 C#中存在两种数据类型,分别是值类型与引用类型,下面我们来看看这两种类型的区别. 值类型主要包括: 简单类型(如int.float.char等,注意string不是值类型): 枚 ...
- Net基础篇_学习笔记_第十二天_面向对象继承(命名空间 、值类型和引用类型)
命名空间可以认为类是属于命名空间的. 解决类的重名问题,可以看做类的“文件夹”如果在当前项目中没有这个类的命名空间,需要我们手动的导入这个类所在的命名空间.1).用鼠标去点2).alt+shift+F ...
- Emit学习(2) - IL - 值类型和引用类型(补)
上周末回家去享受生活了, 工作是为了更好的生活嘛, 所以我把生活, 工作分的比较开. 这几天不是很忙, 在学习工作技能的同时, 发点博文, 也算是做一个学习笔记 上篇中, 贴出的地址里面那位哥, 也有 ...
- 04.C#类型系统、值类型和引用类型(二章2.2-2.3)
今天要写的东西都是书中一些概念性的东西,就当抄笔记,以提问对话的方式将其写出来吧,说不定以后面试能有点谈资~~~ Q1.C#1系统类型包含哪三点特性? A1.C#1类型系统是静态的.显式的和安全的. ...
- 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)
今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...
- Java的值类型和引用类型
一.问题描述 前几天因为一个需求出现了Bug.说高级点也挺高级,说白点也很简单.其实也就是一个很简单的Java基础入门时候的值类型和引用类型的区别.只是开发的时候由于自己的问题,导致小问题的出现.还好 ...
- 【Unity|C#】基础篇(2)——栈与堆、值类型与引用类型
传送门:https://www.cnblogs.com/moonache/p/6008048.html [笔记] 图1:值类型与引用类型 存储方式 > 值类型:数据直接存在栈中 > 引用类 ...
随机推荐
- git设置多账户
1.设置公司gitlab 0.先给git 设置一个全局的账户, 如果是公司的电脑环境, 全局的账户当然是用你在公司的邮箱了 git config --global user.name "yo ...
- React教程:4 个 useState Hook 示例
摘要: React示例教程. 原文:快速了解 React Hooks 原理 译者:前端小智 到 React 16.8 目前为止,如果编写函数组件,然后遇到需要添加状态的情况,咱们就必须将组件转换为类组 ...
- [视频教程] 基于redis的消息队列实现与思考
使用redis的list列表来实现消息队列功能,相信大家都听过消息队列,但是在业务中可能并没有真正去使用它.在公司项目中正好有个场景使用到了消息队列,因此就来说一下流程.在web界面上有个功能是群发邮 ...
- Windows远程桌面多用户登录的问题
RDP WRAPPER 同时登录 多用户补丁 https://cloud.tencent.com/developer/article/1460728 解决系统更新导致无法多用户登录的问题 问题 ...
- Pwnable-bof
Download : http://pwnable.kr/bin/bof Download : http://pwnable.kr/bin/bof.c 下载之后,先看看c源码 #include < ...
- 各版本mysql修改root密码
今天在安装mysql5.7.8的时候遇到一些问题,首当其冲便的是初始root密码的变更,特分享解决方法如下: 1.mysql5.7会生成一个初始化密码,而在之前的版本首次登陆不需要登录. shell& ...
- office 2016 下载链接
[安装环境]:win7/win8/win10 [64位下载] 百度网盘链接:pan.baidu.com/s/1AkiLQtjhayGdx6mw1DQyqw 提取码:qyx9
- LG2921 [USACO2008DEC]Trick or Treat on the Farm 内向基环树
问题描述 LG2921 题解 发现一共有 \(n\) 个点,每个点只有一条出边,即只有 \(n\) 条边,于是就是一个内向基环树. \(\mathrm{Tarjan}\) 缩点. 但是这个题比较猥琐的 ...
- boostrap --- 弹窗modal的使用
<input id="btntext" type="button" value="添加文本组件" data-toggle=" ...
- J2EE中的过滤器和拦截器
过滤器和拦截器的相似之处就是拦截请求,做一些预处理或者后处理. 而过滤器和拦截器的区别在于过滤器是相对HTTP请求而言的,而拦截器是相对Action中的方法的. 过滤器:访问web服务器的时候,对一个 ...