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

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第四节 参数传递对堆栈的影响 2

深入浅出图解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)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。


简介

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


引用类型传递

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

如果使用引用类型:

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

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

会发生这种情况:

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

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


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

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

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

执行下面的Go()方法:

x最终变成Vegetable。

打印结果:

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

  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
原文连接:https://blog.csdn.net/leewhoee/article/details/16978451

相关推荐
superman超哥3 分钟前
Context与任务上下文传递:Rust异步编程的信息高速公路
开发语言·rust·编程语言·context与任务上下文传递·rust异步编程
步达硬件4 分钟前
【Matlab】批量自定义图像处理
开发语言·matlab
军军君016 分钟前
Three.js基础功能学习七:加载器与管理器
开发语言·前端·javascript·学习·3d·threejs·三维
liulilittle8 分钟前
OPENPPP2 网络驱动模式
开发语言·网络·c++·网络协议·信息与通信·通信
mjhcsp11 分钟前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
huihuihuanhuan.xin12 分钟前
后端八股之java并发编程
java·开发语言
寻星探路16 分钟前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
崇山峻岭之间19 分钟前
Matlab学习记录32
开发语言·学习·matlab
向上的车轮19 分钟前
如何选择Python IDE?
开发语言·ide·python
隐退山林31 分钟前
JavaEE:多线程初阶(二)
java·开发语言·jvm