虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。
继续上篇未完成的“参数传递对堆栈的影响”。
传递引用类型跟上一节所示例中用引用的方式传递值类型相似。
如果使用引用类型:
然后调用Go()方法,MyInt会被放到堆里因为它是一个引用类型。
如果执行下面代码中的Go():
会发生这种情况:
因此,我们用pValue改变MyInt的MyValue的值时,x最终也会获得这个改变的值"12345“。
如果我们用引用的方式传递一个引用类型变量呢?
我们有一个类Thing, 类Animal和Vegetables衍生于Thing:
执行下面的Go()方法:
x最终变成Vegetable。
打印结果:
让我们看看堆栈里到底发生了什么情况
调用Go()方法,栈分配一块内存空间给x。
堆分配一块内存空间给Animal。
开始执行Switcharoo()方法,栈分配一块内存空间给pValue并指向x。
栈分配一块内存空间给Vegetable。
pValue改变了x的值使其指向Vegetable的内在地址。
如果我们不是用ref传递的,打印结果正相反。
我们已经演示了参数传递是怎么在内在中处理的。在接下来的文章里,存储在栈中的引用变量会产生什么情况以及怎么解决对象复制带来的问题。
译文连接:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory2B01142006125918PM/csharp_memory2B.aspx
原文连接:https://blog.csdn.net/leewhoee/article/details/16978451