【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2
前言
?
雖然在.Net Framework 中我們不必考慮內在管理和垃圾回收(GC),但是為了優化應用程序性能我們始終需要了解內存管理和垃圾回收(GC)。另外,了解內存管理可以幫助我們理解在每一個程序中定義的每一個變量是怎樣工作的。
?
簡介
?
繼續上篇未完成的“參數傳遞對堆棧的影響”。
?
引用類型傳遞
?
傳遞引用類型跟上一節所示例中用引用的方式傳遞值類型相似。
?
如果使用引用類型(原文可能筆誤,寫的是值類型):
?public class MyInt
{
public int MyValue;
}
然后調用Go()方法,MyInt會被放到堆里因為它是一個引用類型。
public void Go()
{
MyInt x = new MyInt();
}
?
如果執行下面代碼中的Go():
?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;
}
會發生這種情況:
?
因此,我們用pValue改變MyInt的MyValue的值時,x最終也會獲得這個改變的值"12345“。
如果我們用引用的方式傳遞一個引用類型變量呢?
?
用引用的方式傳遞引用類型
我們有一個類Thing, 類?Animal和Vegetables衍生于Thing:
?public class Thing
{
}
public class Animal:Thing
{
public int Weight;
}
public class Vegetable:Thing
{
public int Length;
}
執行下面的Go()方法:
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最終變成?Vegetable。
打印結果:
x is Animal : False x is Vegetable : True
讓我們看看堆棧里到底發生了什么情況
?
如果我們不是用ref傳遞的,打印結果正相反。
?
?
總結
?
我們已經演示了參數傳遞是怎么在內在中處理的。在接下來的文章里,存儲在棧中的引用變量會產生什么情況以及怎么解決對象復制帶來的問題。
?
?
翻譯:?http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory2B01142006125918PM/csharp_memory2B.aspx
?
總結
以上是生活随笔為你收集整理的【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万亿“迪王”不是终点 比亚迪被看好市值可
- 下一篇: 大学女生废话编程爆火!懂不懂编程的看完都