參數
當我們開始調用一個方法的時候,發生了什麼呢?
1.在棧中分配我們方法所需的空間,包括回調的指針空間,該指針通過一條goto指令來回到函數調用開始的那個棧位置的下一個位置,以便繼續執行。
2.我們方法的參數將被拷貝過來。
3.控制器通過JIT方法和線程開始執行代碼,因此我們有了另外一個稱呼叫調棧。
代碼如下:
public int AddFive(int pValue){
int result;
result = pValue + 5;
return result;
}
棧的結構模式:參數在棧中的位置取決於它的類型,值類型本身被拷貝而引用類型的引用被拷貝。 傳遞值類型參數
當我們傳遞一個值類型參數時,內存先被分配然後是值被拷貝到棧中。代碼如下:
class Class1 {
public void Go () {
int x = 5;
AddFive(x);
Console.WriteLine(x.ToString());
}
public int AddFive (int pValue) {
pValue += 5;
return pValue;
}
}
AddFive方法被執行,x位置變成5當AddFive()方法執行結束後,線程回到執行go方法,pValue將被刪除。所以當我們在傳遞一個很大的值類型的時候,程序會逐位的拷貝到棧中,這很明顯就是效率很低。更何況我們的程序如果要傳遞這個值數千次的進行,那麼效率就更低。這時我們就要用到引用類型來解決這樣的問題。
public void Go() {
MyStruct x = new MyStruct();
DOSomething(ref x);
}
public struct MyStruct {
long a, b, c, d, e, f, g, h, i, j, k, l, m;
}
public void DOSomething(ref MyStruct pValue) {
// DO SOMETHING HERE....
}