深入浅出图解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

相关推荐
独隅2 小时前
在 Lua 中,你可以使用 `os.date()` 函数轻松地将时间戳转换为格式化的时间字符串
开发语言·lua
思麟呀3 小时前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释3 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释3 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
lkbhua莱克瓦243 小时前
Java基础——集合进阶3
java·开发语言·笔记
多喝开水少熬夜4 小时前
Trie树相关算法题java实现
java·开发语言·算法
QT 小鲜肉4 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
lsx2024064 小时前
MySQL WHERE 子句详解
开发语言
Tony Bai4 小时前
【Go模块构建与依赖管理】09 企业级实践:私有仓库与私有 Proxy
开发语言·后端·golang
Lucky小小吴4 小时前
开源项目5——Go版本快速管理工具
开发语言·golang·开源