本章內容:
方法的結構
方法體內部的代碼執行
局部變量
局部常量
控制流
方法調用
返回值
返回語句和void方法
局部函數
參數
值參數
引用參數
引用類型作為值參數和引用參數
輸出參數
參數數組
參數類型總結
方法重載
命名參數
可選參數
棧幀
遞歸
棧幀
至此,我們已經知道了局部變量和參數是位于棧上的,下面深入探討一下其組織。
在調用方法的時候,內存從棧的頂部開始分配,保存和方法關聯的一些數據項。這塊內存叫
作方法的棧幀(stackframe)。
- 棧幀包含的內存保存如下內容。
- 返回地址,也就是在方法退出的時候繼續執行的位置。
- 分配內存的參數,也就是方法的值參數,還可能是參數數組(如果有的話)。
- 到和方法調用相關的其他管理數據項。
- 在方法調用時,整個棧幀都會壓入棧。
- 在方法退出的時候,整個棧幀都會從棧上彈出。彈出棧幀有的時候也叫作棧展開(unwind)。
例如,如下代碼聲明了3個方法。Main調用MethodA,MethodA又調用MedhodB,創建了3個
棧幀。在方法退出的時候,棧展開。
class Program
{static void MethodA(int par1,int par2){Console.WriteLine($"Enter MethodA:{par1},{par2}");MethodB(11,18);Console.WriteLine("Exit MethodA");}static void MethodB(int par1,int par2){Console.WriteLine($"Enter MethodB:{par1},{par2}");Console.WriteLine("Exit MethodB");}static void Main(){Console.WriteLine("Enter Main");MethodA(15,30);Console.WriteLine("Exit Main");}
}
遞歸
除了調用其他方法,方法也可以調用自身。這叫作遞歸。
遞歸會產生很優雅的代碼,比如下面計算階乘數的方法就是如此。注意在本例的方法內部,
方法使用比輸入參數小1的實參調用自身。
調用方法自身的機制和調用其他方法其實是完全一樣的,都是為每一次方法調用把新的棧幀
壓入棧頂。
例如,在下面的代碼中,Count方法使用比輸人參數小1的值調用自身,然后打印輸人的參
數。隨著遞歸越來越深,棧也越來越大。