.net垃圾回收学习【C#中的stack和Hepa】【续2】
2011-08-21 22:35
525 查看
From http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory2B01142006125918PM/csharp_memory2B.aspx记录学习。
当我们执行如下代码的时候:
这个过程中发生了如下的事情:开始调用GO方法的时候,X变量进入stack中。开始调用DoSometing方法的时候,参数pValue进入Stack中。x的值(在stack上的MyInt的地址)被copy给了pValue.所以当修改heap上的值的时候,x的值也发生了变化。那么,如果我们通过引用传递一个引用类型会发生什么呢?假如我们有如下类:
1. 开始调用Go方法的时候,参数x进入stack中2. Animal在heap上创建3. 开始调用Switcharoo()方法,pValue进入Stack,并且指向了x。
4. Vegetable在heap创建5. x的值被修改为Vegetable的地址。todo: 考虑一下字符串的内存分配和处理,为什么系统中的代码都会添加ref参数。
Passing Reference Types.
传递引用类型的参数和之前通过引用传递至类型的参数有点类似。如下代码:public class MyInt
{
public int MyValue;
}当调用Go方法的时候,由于MyInt是一个引用类型,所以在heap创建
public void Go()
{
MyInt x = new MyInt();
}
![](http://images.cnblogs.com/cnblogs_com/sunshinefly128/201108/201108212233563944.gif)
public void Go()
{
MyInt x = new MyInt();
x.MyValue = 2;
DoSomething(x);
Console.WriteLine(x.MyValue.ToString());
}
public void DoSomething(MyInt pValue)
{
pValue.MyValue = 12345;
}stack和heap上的情况如下:
![](http://images.cnblogs.com/cnblogs_com/sunshinefly128/201108/20110821223403427.gif)
public class Thing
{
}
public class Animal:Thing
{
public int Weight;
}
public class Vegetable:Thing
{
public int Length;
}当我们执行如下的方法的时候:
public void Go()
{
Thing x = new Animal();
Switcharoo(ref x);
Console.WriteLine(
"x is Animal : "
+ (x is Animal).ToString());
Console.WriteLine(
"x is Vegetable : "
+ (x is Vegetable).ToString());
}
public void Switcharoo(ref Thing pValue)
{
pValue = new Vegetable();
}执行结果如下:
x is Animal : Falsex is Vegetable : True
让我们看一下发生了什么:![](http://images.cnblogs.com/cnblogs_com/sunshinefly128/201108/201108212234277851.gif)
![](http://images.cnblogs.com/cnblogs_com/sunshinefly128/201108/201108212234574125.gif)
相关文章推荐
- .net垃圾回收学习[C#中的Stack和heap][续3]
- .net垃圾回收学习【C# 中的Stack和Heap】【翻译&&学习】
- .net垃圾回收学习【C#中的Stack和heap]【续1】
- .net 垃圾回收学习[C#中的stack和Heap]
- c#学习笔记-.net垃圾回收机制
- .net 垃圾回收学习[Stack 和 Heap的理解]
- .net 垃圾回收学习[Stack 和 Heap的理解][续1]
- .net垃圾回收学习【NET Best Practice No: 3:- Using performance counters to gather performance data】【翻译&&学习】
- [转]对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会
- 对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会(转)
- C#学习笔记12-GC的工作原理基础和垃圾回收机制
- C#垃圾回收学习总结
- .net 垃圾回收学习[How To: Use CLR Profiler][翻译&&学习]【2】
- C#学习笔记之垃圾回收机制
- 对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会
- .net垃圾回收学习[NET 2.0 Performance Guidelines - Garbage Collection][翻译加学习]【2】
- C#学习笔记-垃圾回收机制
- .net 垃圾回收学习[Stack 和 Heap的理解][续2]
- 《读书笔记》C#/.Net 的托管堆和垃圾回收
- .net 垃圾回收学习【.net 框架程序设计】[CH19: 自动内存管理]