深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第三节 栈与堆,值类型与引用类型

  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.csdn.net/mdeditor/101022949#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型](https://mp.csdn.net/mdeditor/101023885#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1](https://mp.csdn.net/mdeditor/101026168#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2](https://mp.csdn.net/mdeditor/101027584#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复](https://mp.csdn.net/mdeditor/101028008#)
  • [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能](https://mp.csdn.net/mdeditor/101029557#)
  • 栈与堆,值类型与引用类型
    • 前言
    • 简介
    • 值类型会存储在堆里?
    • 堆栈原理对代码的影响
      • 使用值类型
      • 使用引用类型
        • 第一个示例中
        • 第二个示例
    • 总结

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能

栈与堆,值类型与引用类型

前言

虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。


简介

本文将介绍值类型与引用类型在堆栈里的基本存储原理。


值类型会存储在堆里?

是的,值类型有时候就是会存储在堆里。上一节中介绍的黄金规则2:值类型和指针永远存储在它们声明时所在的堆或栈里。如果一个值类型不是在方法中定义的,而是在一个引用类型里,那么此值类型将会被放在这个引用类型里并存储在堆上。

代码图例

我们定义一个引用类型:
在这里插入图片描述
里面包含一个值类型MyValue。
执行下面的方法:
在这里插入图片描述

就像上一节介绍的一样,线程开始执行此方法,参数pValue将会被放到当前线程栈上。
在这里插入图片描述
接下来不同于上一节所介绍的是MyInt是一个引用类型,它将被放到堆上并在栈上放一个指针指向它在堆里的存储。
在这里插入图片描述

当AddFive()执行完成后,如上一节所讲栈开始清理。
在这里插入图片描述

现在是需要C#垃圾回收GC的时候了。当我们的程序所占内存到达临界值时(即将溢出),我们会需要更多的堆空间,GC就会开始运行。GC停止所有当前运行线程(整体停止),找到堆里所有主程序不会访问到的对象并删除它们。然后,GC会识别所有堆里剩下的对象并分配内存空间给它们,同时调整堆和栈里指向它们的指针。你可以想像这是非常耗资源的,这会影响到程序的性能。这就是为什么我们需要理解和注意堆栈的使用,进而写出高性能代码。


堆栈原理对代码的影响

当我们使用引用类型时,我们在和指向引用类型的指针打交道,而不是引用类型本身。
当我们使用值类型时,我们就是在和值类型本身打交道。

代码图例

使用值类型

假设执行方法:
在这里插入图片描述
我们会得到值 3。


使用引用类型

在这里插入图片描述

如果执行方法:
在这里插入图片描述
我们得到的值是4而不是3!(译外话:这是很简单,但相信还是有很多人不知道原理的)


第一个示例中

在这里插入图片描述
在这里插入图片描述
x就是3,y就是4。操作两个不同对象。

第二个示例

在这里插入图片描述
在这里插入图片描述
得到的值是4不是3是因为我们操作栈里两个指针并且它们指向堆里同一个对象。

总结

希望这篇文章能帮助你更好的理解值类型变量与引用类型变量的不同,同时理解什么是指针,什么时候用到指针。以后的文章里会更深入的介绍C#内存管理并详细阐述方法参数。

译文连接:https://blog.csdn.net/leewhoee/article/details/16957545
原文链接:https://www.c-sharpcorner.com/article/C-Sharp-heaping-vs-stacking-in-net-part-i/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/581515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目】玩具租赁博客测试报告

目录 一、项目背景 二、项目功能 三、功能测试 一、项目背景 玩具租赁系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,同时将其部署到云服务器上。前端主要有十五个页面构成:用户注册、管理员注册、登录页、用户和管理…

Qt 中使用 MySQL 数据库保姆级教程(下)

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 上篇中我们安装好了 MySQL 数据库和 Navicat 软件,下面在 Qt 中尝试使用数据库 1. 在 Qt 中连接 MySQL 数据库&#…

NAS上使用Docker搭建Wiki.js构建云知识库

文章目录 NAS上使用Docker搭建Wiki.js、PostgreSQL和Nginx云知识库前置条件步骤1:获取wikijs的镜像步骤2:配置容器参数2.1 端口设置2.2 挂载设置2.3 环境变量设置(配置数据库) 步骤3. 启动界面3.1 切换语言3.2 GIT 配置3.3 用户和…

【K8S 二进制部署】部署Kurbernetes的网络组件、高可用集群、相关工具

目录 一、K8S的网络类型: 1、K8S中的通信模式: 1.1、、pod内部之间容器与容器之间的通信 1.2、同一个node节点之内,不同pod之间的通信方式: 1.3、不同node节点上的pod之间是如何通信的呢? 2、网络插件一&#xff…

jQuery: 整理5---删除元素和遍历元素

1. 删除元素 span{color: white;padding: 8px;margin: 5px;float: left;}.green {background-color: green;}.blue {background-color: blue;}<span class"green">green</span><span class"blue">blue</span><span class"…

门控循环单元(GRU)-多输入回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、全部代码数据分享&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译…

Apache Jackrabbit漏洞浅析

Apache Jackrabbit是一个Java开源内容存储库&#xff0c;1.0.0 < 版本 < 2.20.11、2.21.0 < 版本 < 2.21.18存在RMI功能导致的远程代码执行漏洞。 补丁分析 对比补丁前后两个版本&#xff08;https://github.com/apache/jackrabbit/compare/jackrabbit-2.20.10..…

计算机图形学理论(5):光能传递

局部照明与全局照明 局部照明 只考虑从物体表面到眼睛的直射光。 全局照明 全局照明考虑了直接照明和间接照明&#xff08;根据应用配置可以有多次反射&#xff09;。 全局照明技术 光能传递 光能传递是一种模拟从光源开始的光漫反射传播的方法。这种方法的基础来自于“…

Python-动态柱状图可视化

柱状图 1.基础柱状图1.1通过Bar构建基础柱状图1.2反转x轴&#xff0c;y轴1.3数值标签在右侧1.4总结 2.基础时间柱状图2.1掌握基础的时间线配置动态图表2.2创建时间线2.3自动播放2.4时间线设置主题2.5总结 3.GDP动态柱状图绘制3.1掌握列表的sort方法并配合配合lambda匿名函数完成…

【数据库系统概论】第5章-数据库完整性

文章目录 引言5.1 实体完整性5.2 参照完整性5.3 用户定义的完整性5.4 完整性约束命名子句5.6 触发器 引言 数据库的完整性是指数据的正确性和相容性。 正确性&#xff1a;符合现实语义、反映当前实际情况。性别必须为男或女。 相容性&#xff1a;数据库同一对象在不同关系表中…

115基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)

基于matlab的用于铣削动力学建模的稳定性叶瓣图分析(stablity lobe)&#xff0c;程序已调通&#xff0c;可直接运行。 115matlab铣削动力学 (xiaohongshu.com)

生活常识-如何开社保证明(四川)

下载并打开天府市民云APP 注册后登陆 点击社保服务 点击社保证明 点击【四川省社会保险个人社保证明名(近24个月)】 点击下载 下载后点击【QQ发送给好友&#xff0c;然后发送给自己的电脑设备(我的电脑)】

数据类型-变量-内存四区-指针

1、内存四区 1.1、数据类型的本质 1&#xff09;数据类型基本概念 类型是对数据的抽象类型相同的数据具有相同的表示形式、存储格式、相关的操作程序中使用的数据必定属于某种数据类型数据类型和内存 有关系C/C 引入数据类型&#xff0c;可以更方便地管理数据 2&#xff09…

laravel5.8中实现验证码组件的安装和验证

本篇文章主要讲解使用laravel5.8自带的验证码库实现验证码验证的效果教程。通过本教程你可以快速接入到自己的项目中开发相应的验证功能。 作者&#xff1a;任聪聪 (rccblogs.com) 日期&#xff1a;2023年12月17日 实际效果 安装步骤 步骤一、输入命令 composer require mews…

代理模式:中间者的故事

代理模式&#xff1a;中间者的故事 介绍需求分析代理模式代码实现代理模式整理和用途第一种用途第二种用途第三种用途第四种用途 总结 介绍 本文引用《大话设计模式》第七章节的内容进行学习分析&#xff0c;仅供学习使用 需求&#xff1a;小明拜托自己好朋友小王给他朋友小美…

Swift函数式编程——函数

目录 Swift函数式编程&#xff0d;函数 高阶函数&#xff08;Higher order function&#xff09; 一等函数&#xff08;First class function&#xff09; 闭包 函数柯里化&#xff08;Function Curring&#xff09; 函数式思维 使用函数解决问题 使用函数组合 总结 Sw…

解决IDEA 不能正确识别系统环境变量的问题

问题描述 本人laptop 上的是设置了GOOGLE_APPLICATION_CREDENTIALS 这个环境变量的&#xff0c; 正常java or python 的程序能基于这个环境变量使用 某个gcp service account 去访问GCP的资源 [gatemanmanjaro-x13 ~]$ env | grep -i google GOOGLE_APPLICATION_CREDENTIALS/…

2023年,写博客带给我的收获与成长

文章目录 前言写博客的心路历程膜拜写博客大佬博客大佬带来的诱惑尝试写博客坚持写博客 决定写博客的原因2023年写博客的成就博客的创作粉丝的增长博客专家成就商务合作 2024年对技术写作的展望 前言 没错&#xff0c;我就是那个考试睡大觉、作文空白交卷的王二蛋。面对写作&a…

SpringBoot2.7-集成Knife4j

Knife4j 是什么 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案 添加依赖 <!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knif…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…