1)形參
形參顧名思義就是形式上的參數,不是實際的參數,它代替實際傳入方法的值。在方法體代碼中代表了值本身參與運算。形參定義於參數中,它不同於方法體內局部變數,因為是一個變數,在它的範圍內不允許存在一個同名的局部變數,不管他們的類型是否相同,都是不允許出現同名的。
看下面的程式碼範例:
1 //這其中的strName就是一個形參也是一個變數,不允許出現同名的局部變數2 public void SayHelloTo(string strName)3 {4 Console.WriteLine("我的名字是{0}", strName);5 }
形參的特點:
①形參是一個變數,它具有變數的全部特點。②方法的形參可以有多個,形參直接使用逗號進行隔開,即使類型相同的多個參數也不可以合并聲明。
2)實參
實參是相對於形參而言的,形參是實際值的“替身”,這個替身所代表的實際值即為實參。實際值可以是一個具體的值,也可以是一個變數
看下面的程式碼範例:
1 static void Main(string[] args) 2 { 3 Program pro = new Program(); 4 int nNum = 10; 5 //當調用Add方法時,傳進去兩個參數,第一個是實際的值, 6 //第二個nNum是變數,但是在傳入方法時已經初始化 7 int nResult = pro.Add(20, nNum); 8 } 9 10 //這裡的a,b即為所謂的形參11 public int Add(int a, int b)12 {13 return a + b;14 }
①實參用於初始化形參的實際值或者運算式②實參位於要調用的方法參數列表中。
3)按值傳遞參數
值參數是通過將實參的值複製到形參。來實現將值傳遞到方法,也就是所謂的按值傳遞,當方法被調用是,CLR做如下操作:
①在託管棧堆中為形參分配空間 ②將實參的值複製到形參
其中,在值參數中,實參也可以是任何計算結果滿足類型要求的運算式,不一定是變數。
看下面的程式碼範例:
1 static void Main(string[] args) 2 { 3 Program pro = new Program(); 4 //int nNum = 10; 5 //當調用Add方法時,傳進去兩個參數,第一個是實際的值, 6 //第二個nNum是變數,但是在傳入方法時已經初始化 7 //int nResult = pro.Add(20, nNum); 8 int i = 10; 9 int w = 20;10 //在這裡i * 2和(w+10)/10充當了實參的角色11 int nResult = pro.Add(i * 2, (w + 10) / 10);12 Console.WriteLine(nResult);13 }14 15 //這裡的a,b即為所謂的形參16 public int Add(int a, int b)17 {18 return a + b;19 }
下面看一段代碼,分別觀察形參,實參在託管堆和託管棧中的分配和使用方式
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Program pro = new Program(); 6 Rectangle rectange = new Rectangle(); 7 int myValue = 10; 8 9 //這裡的rectange,myValue是實參10 pro.CalculateArea(rectange, myValue);//調用方法11 }12 13 //這裡的(Rectangle rect,int value)是形參14 public void CalculateArea(Rectangle rect,int value)15 {16 rect.Length += 10;17 rect.width += 15;18 rect.Area = rect.Length * rect.width;19 value++;20 }21 }22 23 //一個矩形類24 public class Rectangle25 {26 public int Length = 10;27 public int width = 15;28 public int Area;29 }
①在方法被調用前:系統在棧中為Rectangle類的執行個體rectange和實值型別myValue分配空間,其中參考型別rectange指向堆中的Rectangle對象執行個體,myValue是實值型別,因此其值位於託管棧中。示範圖如下
②方法調用開始時:實參將值複製到CalculateArea的形參,其中rectange為參考型別,因為複製一個新的引用——rect,此刻這兩個引用都指向同一個對象,myValue是實值型別,因此可以直接複製其值——value。示範圖如下:
③方法調用過程中,改變引用所指向對象的length欄位和width欄位,以及value值自增1
④方法調用以後,形參rect和value被從棧中彈出。myValue是實值型別,他的值並沒有改變(改變的是形參value);rectange是參考型別,對它所作的修改實際是對託管堆中的對象做的修改,其值未修改後的值。
要明白值傳遞參數,主要明白實值型別和參考型別在託管棧和託管堆中的作用狀態。這樣理解起來就非常的容易。