前言

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

简介

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

值类型会存储在堆里?

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

代码图例

我们定义一个引用类型:

  1. public class MyInt

  2. {

  3. public int MyValue;

  4. }

里面包含一个值类型MyValue。

执行下面的方法:

  1. public MyInt AddFive(int pValue)

  2. {

  3. MyInt result = new MyInt();

  4. result.MyValue = pValue + 5;

  5. return result;

  6. }

就像上一节介绍的一样,线程开始执行此方法,参数pValue将会被放到当前线程栈上。

接下来不同于上一节所介绍的是MyInt是一个引用类型,它将被放到堆上并在栈上放一个指针指向它在堆里的存储。

当AddFive()执行完成后,如上一节所讲栈开始清理。

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

堆栈原理对代码的影响

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

当我们使用值类型时,我们就是在和值类型本身打交道。

代码图例

假设执行方法:

  1. public int ReturnValue()

  2. {

  3. int x = new int();

  4. x = 3;

  5. int y = new int();

  6. y = x;

  7. y = 4;

  8. return x;

  9. }

我们会得到值 3

使用引用类型:

  1. public class MyInt

  2. {

  3. public int MyValue;

  4. }

如果执行方法:

  1. public int ReturnValue2()

  2. {

  3. MyInt x = new MyInt();

  4. x.MyValue = 3;

  5. MyInt y = new MyInt();

  6. y = x;

  7. y.MyValue = 4;

  8. return x.MyValue;

  9. }

我们得到的值是4而不是3!(译外话:这是很简单,但相信还是有很多人不知道原理的)

第一个示例中:

  1. public int ReturnValue()

  2. {

  3. int x = 3;

  4. int y = x;

  5. y = 4;

  6. return x;

  7. }

x就是3,y就是4。操作两个不同对象。

第二个示例:

  1. public int ReturnValue2()

  2. {

  3. MyInt x;

  4. x.MyValue = 3;

  5. MyInt y;

  6. y = x;

  7. y.MyValue = 4;

  8. return x.MyValue;

  9. }

得到的值是4不是3是因为我们操作栈里两个指针并且它们指向堆里同一个对象。

总结

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

翻译于: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型相关推荐

  1. 转:图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

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

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

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

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

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

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

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

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

  6. 栈和托管堆/值类型和引用类型/强制类型转换/装箱和拆箱[C#]

    一.栈和托管堆 通用类型系统(CTS)区分两种基本类型:值类型和引用类型.它们之间的根本区别在于它们在内存中的存储方式..NET使用两种不同的物理内存块来存储数据-栈和托管堆.如下图所示:     值 ...

  7. 值类型和引用类型在栈和堆中的分配

      类型基础及背后的工作原理   数据在内存中的分配与传递    值类型和引用类型它们在内存分配与传递上的区别 内存分配 首先要了解一下内存中栈和堆的概念.     栈(Stack) ##栈是一种先进 ...

  8. .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱

    .NET六大剑客:栈.堆.值类型.引用类型.装箱和拆箱 一."堆","栈"专区 这两个字我相信大家太熟悉了,甚至于米饭是什么?不知道..."堆&quo ...

  9. 堆和栈、值类型与引用类型、装箱与拆箱

    堆栈:内存条里的某一块. 电脑中有6个地方可以保存数据. <1>寄存器:保存最快.这东西在处理器内部.也就是CPU里的一小块地方给你放数据.既然是CPU,那么主要工作是计算,所以这块寄存器 ...

最新文章

  1. python编程工资-2019年Python就业薪资怎么样?看完你就了解了
  2. Java学习个人备忘录之线程间的通信
  3. zabbix自动发现主机并加入组绑定模板
  4. Wireshark 实用过滤表达式
  5. java api 第一个类是_JAVA之Object常用API
  6. 自动化运维工具——ansible详解(一)
  7. sourcetree提示无效路径_关于今明可转债申购的温馨提示
  8. ashx 使用Session
  9. 基于PHP的网上书店系统(前后台)
  10. MySQL配置+SQLyog安装教程
  11. android电话本导入iphone,如何将Android电话簿导入iPhone手机
  12. 逻辑设计基础_芯片设计--TCAM概述
  13. google 搜索十大搜索技巧和实用小技巧
  14. android 脸部识别之3D,这两款安卓手机也支持3D结构光人脸识别
  15. 【C语言】日期时间转秒数
  16. 如何对台式计算机 笔记本进行日常维护,笔记本电脑日常怎么保养?这些方法别错过了...
  17. 64位系统使用Access 数据库文件遇到的错误和解决办法
  18. GitLab下载、安装和初次登录
  19. UEditor 百度编辑器 工具栏 新增自定义按钮及功能
  20. Uigreat v1.5.1响应式网站平扁设计风格blog自媒体平台WordPress主题

热门文章

  1. 第一阶段SCRUM冲刺 08
  2. 发现了拯救“文献多的一团麻”的工具
  3. ccf--20140903--字符串匹配
  4. 【转载】linux进程及进程控制
  5. 怎样的中奖算法能让人信服
  6. 利用SVN工具下载OpenCore代码
  7. [剑指offer][JAVA]面试题第[64]题[求1+2+…+n][逻辑运算符]
  8. AtCoder-2379 - 连接竹竿 思维 | 数学
  9. python全栈工程师能接到私活么_Python全栈工程师(包、模块 的导入)
  10. linux c c 常用的日志库,mslog: 一款超轻量级的C日志库,无需依赖额外的库,测试或移植过的系统有Linux(ubuntu,centos),Windows以及部分嵌入式设备;...