参考以下博文,我这里只是笔记一下,原文会更加详细

c#基础系列1---深入理解值类型和引用类型

堆栈和托管堆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# 值类型和引用类型 笔记的更多相关文章

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

    [TOC] C#学习笔记之值类型与引用类型 1.值类型与引用类型 1.1 深层区别 值类型与引用类型有不同的内存分布,这导致了不同的内存管理机制: 值类型由OS负责内存管理 引用类型由垃圾回收器(GC ...

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

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

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

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

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

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

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

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

  6. 04.C#类型系统、值类型和引用类型(二章2.2-2.3)

    今天要写的东西都是书中一些概念性的东西,就当抄笔记,以提问对话的方式将其写出来吧,说不定以后面试能有点谈资~~~ Q1.C#1系统类型包含哪三点特性? A1.C#1类型系统是静态的.显式的和安全的. ...

  7. 6个重要的.NET概念: - 堆栈,堆,值类型,引用类型,装箱和拆箱(转)

    今天在Code Project上面看到一篇文章<6 important .NET concepts: - Stack, heap, Value types, reference types, b ...

  8. Java的值类型和引用类型

    一.问题描述 前几天因为一个需求出现了Bug.说高级点也挺高级,说白点也很简单.其实也就是一个很简单的Java基础入门时候的值类型和引用类型的区别.只是开发的时候由于自己的问题,导致小问题的出现.还好 ...

  9. 【Unity|C#】基础篇(2)——栈与堆、值类型与引用类型

    传送门:https://www.cnblogs.com/moonache/p/6008048.html [笔记] 图1:值类型与引用类型 存储方式 > 值类型:数据直接存在栈中 > 引用类 ...

随机推荐

  1. VMWare虚拟机应用介绍

    目录 一:VMWare简介 二:VMWare启动第一个虚拟机 一:VMWare简介   VMWare虚拟机软件是一个"虚拟PC"软件,它使你可以在一台机器上同时运行二个或更多Win ...

  2. Linux网络——配置防火墙的相关命令

    Linux网络——配置防火墙的相关命令 摘要:本文主要学习了如何在Linux系统中配置防火墙. iptables命令 iptables准确来讲并不是防火墙,真正的防火墙是运行于系统内核中的netfil ...

  3. PHP odbc_errormsg ODBC 函数

    定义和用法 odbc_errormsg - 获取最后一条错误消息 语法 odbc_errormsg ( [ resource $connection_id ] ) 返回包含最后一个ODBC错误消息的字 ...

  4. iOS安全攻防(一):Hack必备的命令与工具

    转自:http://blog.csdn.net/yiyaaixuexi/article/details/8288077 你的应用正在被其他对手反向工程.跟踪和操作!你的应用是否依旧裸奔豪不防御? 郑重 ...

  5. 【转载】每个 Android 开发者必须知道的消息机制问题总结

    Android的消息机制几乎是面试必问的话题,当然也并不是因为面试,而去学习,更重要的是它在Android的开发中是必不可少的,占着举足轻重的地位,所以弄懂它是很有必要的.下面就来说说最基本的东西. ...

  6. 工具类ToastUtil 避免在子线程中使用抛异常 "Can't create handler inside thread that has not called Looper.prepare()"

    package com.example.kbr.utils; import android.view.Gravity; import android.widget.Toast; import io.r ...

  7. markdown的语法

    目录 md格式是一个纯文本格式,对于一个程序员来说,用md格式代替word.txt等格式用来写说明文档或者blog,目前github以及CSDN都支持md格式书写blog了. md格式的语法: 无序列 ...

  8. c 和 c++ 啊 Make

  9. 【转】阿里云部署java web项目

    主要步骤:1. 购买阿里云服务器2. 远程连接3. 在云服务器上配javaweb环境:jdk,tomcat,MySQL4. 将项目的war文件放到Tomcat下关于云服务器ECS:如果还想在买服务器之 ...

  10. 古来月小队 Alpha冲刺阶段博客目录

    一.Scrum Meeting 第六周: 链接:https://www.cnblogs.com/ouc-xxxxxx/p/11789325.html 任务:搭建安卓编程环境,学习安卓前端知识 第七周: ...