1. 程式人生 > >C#形參,實參,值傳遞引數,引用傳遞引數,輸出引數,引數陣列的學習

C#形參,實參,值傳遞引數,引用傳遞引數,輸出引數,引數陣列的學習

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 Rectangle
25     {
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是引用型別,對它所作的修改實際是對託管堆中的物件做的修改,其值未修改後的值。

要明白值傳遞引數,主要明白值型別和引用型別在託管棧和託管堆中的作用狀態。這樣理解起來就非常的容易。