前言

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

简介

继续上篇未完成的“参数传递对堆栈的影响”。

引用类型传递

传递引用类型跟上一节所示例中用引用的方式传递值类型相似。

如果使用引用类型(原文可能笔误,写的是值类型):

 
  1. public class MyInt

  2. {

  3. public int MyValue;

  4. }

然后调用Go()方法,MyInt会被放到堆里因为它是一个引用类型。

 
  1. public void Go()

  2. {

  3. MyInt x = new MyInt();

  4. }

如果执行下面代码中的Go():

 
  1. public void Go()

  2. {

  3. MyInt x = new MyInt();

  4. x.MyValue = 2;

  5. DoSomething(x);

  6. Console.WriteLine(x.MyValue.ToString());

  7. }

  8. public void DoSomething(MyInt pValue)

  9. {

  10. pValue.MyValue = 12345;

  11. }

会发生这种情况:

  1. 开始调用Go(),栈分配一块内存空间给x。
  2. 执行行到DoSomething(),栈分配一块内在空间给pValue。
  3. x的值是堆中MyInt对应在栈里的内存地址,复制x给pValue。

因此,我们用pValue改变MyInt的MyValue的值时,x最终也会获得这个改变的值"12345“。

如果我们用引用的方式传递一个引用类型变量呢?

用引用的方式传递引用类型

我们有一个类Thing, 类 Animal和Vegetables衍生于Thing:

 
  1. public class Thing

  2. {

  3. }

  4. public class Animal:Thing

  5. {

  6. public int Weight;

  7. }

  8. public class Vegetable:Thing

  9. {

  10. public int Length;

  11. }

执行下面的Go()方法:

 
  1. public void Go()

  2. {

  3. Thing x = new Animal();

  4. Switcharoo(ref x);

  5. Console.WriteLine(

  6. "x is Animal : "

  7. + (x is Animal).ToString());

  8. Console.WriteLine(

  9. "x is Vegetable : "

  10. + (x is Vegetable).ToString());

  11. }

  12. public void Switcharoo(ref Thing pValue)

  13. {

  14. pValue = new Vegetable();

  15. }

x最终变成 Vegetable。

打印结果:

x is Animal    :   False
x is Vegetable :   True

让我们看看堆栈里到底发生了什么情况

  1. 调用Go()方法,栈分配一块内存空间给x。
  2. 堆分配一块内存空间给Animal。
  3. 开始执行Switcharoo()方法,栈分配一块内存空间给pValue并指向x。
  4. 栈分配一块内存空间给Vegetable。
  5. pValue改变了x的值使其指向Vegetable的内在地址。

如果我们不是用ref传递的,打印结果正相反。

总结

我们已经演示了参数传递是怎么在内在中处理的。在接下来的文章里,存储在栈中的引用变量会产生什么情况以及怎么解决对象复制带来的问题。

翻译: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory2B01142006125918PM/csharp_memory2B.aspx

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

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

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

  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) 第四节 参数传递对堆栈的影响 1

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

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

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

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

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

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

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

  7. STM32:堆和栈(Heap Stack)及SRAM存储使用

    STM32堆和栈(Heap & Stack)及SRAM存储使用 编译一个程序,出现下面的信息: 明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经 ...

  8. stm32 堆和栈(stm32 Heap Stack)

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

  9. STM32堆和栈(Heap Stack)及SRAM存储使用

    编译一个程序,出现下面的信息: 明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间.让我们打开map文件: 可以看到每个文 ...

最新文章

  1. android 注册、登录实现程序
  2. python django 模板
  3. 区块链基础设施纵览:基本框架原则——揭示存储、计算和通信元素
  4. Vuex——命名空间导致错误[unknown action type:XXX]解决方案
  5. shopee虾皮科技测试工程师第一次笔试
  6. Linux C 服务器端这条线怎么走?
  7. 斐讯k1路由器刷Breed BootLoader(不死UBoot)
  8. BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
  9. VsFTP出现500 OOPS: cannot change directory的解决办法
  10. haproxy keepalived_Haproxy+KeepAlived+Mycat实现高可用集群
  11. 以太网的分层架构_读《企业应用架构模式》记录-分层
  12. Python人工智能第一篇:语音合成和语音识别
  13. (转)spring boot整合redis
  14. mysql 循环 索引值,mysql:循环遍历表和alter table添加索引
  15. 局域网 以太网 令牌环网(一)
  16. php 将网页转成pdf_利用PHP将HTML页面转换成PDF文件
  17. 惠普m128fn中文说明书_惠普M128fp中文说明书
  18. 根据程序流程图化程序流图_程序流程图有什么用?简单实用的流程图模板大全...
  19. Java:Parents、Father和Mother类
  20. MacBook将大文件分割成很多个小文件split命

热门文章

  1. 【C++深度剖析教程9】初探C++标准库
  2. SAS对数据变量的处理
  3. 如何获取枚举字符串,值及遍历枚举(转)
  4. Java开启/关闭tomcat服务器
  5. 【多视图几何】TUM 课程 第2章 刚体运动
  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第25篇]使用特殊的素数定义GF(p)和GF(2^n)的方法
  7. 服务器水厂物资管理系统,水处理管理系统及水处理管理服务器 Water management systems and water treatment management server...
  8. 1476D. Journey
  9. eclipse发布web不带项目名的url
  10. maven引入springframework的猫腻