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

1)形參spa

形參顧名思義就是形式上的參數,不是實際的參數,它代替實際傳入方法的值。在方法體代碼中表明瞭值自己參與運算。形參定義於參數中,它不一樣於方法體內局部變量,由於是一個變量,在它的做用域內不容許存在一個同名的局部變量,無論他們的類型是否相同,都是不容許出現同名的。3d

看下面的代碼示例:code

1 //這其中的strName就是一個形參也是一個變量,不容許出現同名的局部變量
2         public void SayHelloTo(string strName)
3         {
4             Console.WriteLine("個人名字是{0}", strName);
5         }

形參的特色:對象

①形參是一個變量,它具備變量的所有特色。②方法的形參能夠有多個,形參直接使用逗號進行隔開,即便類型相同的多個參數也不能夠合併聲明。blog

2)實參作用域

實參是相對於形參而言的,形參是實際值的「替身」,這個替身所表明的實際值即爲實參。實際值能夠是一個具體的值,也能夠是一個變量string

看下面的代碼示例:it

 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         }

①實參用於初始化形參的實際值或者表達式②實參位於要調用的方法參數列表中。class

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

 

要明白值傳遞參數,主要明白值類型和引用類型在託管棧和託管堆中的做用狀態。這樣理解起來就很是的容易。

相關文章
相關標籤/搜索