標籤:
一. 綜述(本文內容大部分來自網路,經本人整理而成,僅供學習參考,不免理解錯誤,歡迎批評指正)
- 在c#中,方法的參數傳遞有四種類型:
(1) 傳值參數(by value)
傳值參數無需額外的修飾符。傳值參數在方法調用過程中,如果改變了參數的值,那麼傳入方法的參數在方法調用完成以後並不因此而改變,而是保持原來傳入的值。實際
上,傳值參數傳遞的是調用參數的一份拷貝,因此在調用方法的過程中,即使改變了參數的值,也不會影響到實際傳入的參數值,詳見常式:
(2) 傳址參數(by reference)
傳址參數需要修飾符ref(關鍵字),傳址參數如果在方法的調用過程中改變了參數的值,那麼傳入方法的參數在調用完成以後也隨之改變。傳址參數傳遞的是調用參數的 記憶體位址,該參數在方法內外指向同一個儲存位置。因此,在調用方法過程中如果改變了參數的值,呢麼實際出入的參數值也會隨之改變,詳見常式:
-
- 方法參數上的ref方法參數關鍵字,使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。
- 若要使用ref參數,必須將參數作為ref參數顯示傳遞到方法;
- 傳遞到ref參數的參數必須先初始化;
- 屬性不是變數,不能作為ref參數傳遞;
(3) 輸出參數(by output)
輸出參數需要修飾符out(關鍵字)。
-
- 方法參數上的out方法參數關鍵字,使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。
- 當希望方法返回多個值時,聲明out方法非常有用。使用out參數的方法仍然可以返回一個值,一個方法可以有一個以上的out參數。
- 在使用out參數前,不必初始化作為out參數傳遞的變數,然而必須在方法返回之前為out參數賦值。
- 屬性不是變數,不能做為out參數傳遞。
(4)數組參數(by array)
數組參數需要修飾符params。
2. ref關鍵字與out關鍵字的區別
在c#中,既可以通過值也可以通過引用傳遞參數。通過引用傳遞參數允許函數成員更改參數的值,並保持更改,若要通過引用傳遞參數,可使用ref和out關鍵字。ref和 out都可以提供相似的功效,其作用也很想c中的指標變數。它們的區別是:
(1)使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。
(2)使用ref和out時,在方法的參數和執行方法時,都要加ref或out關鍵字,以滿足匹配。
(3)out適合用在需要return多個傳回值的地方,而ref則用在需要被調用的方法修改修改調用者的引用的時候。
二. 常式
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Collections; 6 7 namespace ConsoleApplication5 8 { 9 class Program10 {11 //使用普同傳值參數的函數12 static void ValueTest(int x, int y)13 {14 x = 3;15 y = 3;16 }17 18 //使用ref傳址參數的函數19 static void RefTest(ref int x, ref int y)20 {21 x = 1;22 y = x;23 }24 25 //使用out輸出參數的函數26 static void OutTest(out int x, out int y)27 {28 //離開這個函數前,必須對x和y賦值,否則會報錯29 //y = x;30 //上面這行會報錯,因為使用了out後,x和y都清空了,需要重新賦值,即使調用函數前賦過值也不行31 x = 1;32 y = 2;33 }34 35 static void Main(string[] args)36 {37 /************測試普通的傳值參數*******************/38 int a = 4;39 int b = 7;40 ValueTest(a, b);//調用該函數不會改變變數a,b的值41 Console.WriteLine("a={0};b={1}", a, b);//此處輸出a,b的值分別為4,742 43 /************測試“ref”*******************/44 //int m;45 //int n;46 //RefTest(ref m, ref n);47 //上面這行會出錯,ref使用前,變數m,n必須賦值48 49 int o = 11;50 int p = 22;51 RefTest(ref o, ref p);52 Console.WriteLine("m={0};n={1}", o, p);//o和p的值將會變為RefTest函數中所改變的值,此處輸出o為1,,p為153 54 /************測試普通的傳值參數*******************/55 //使用out參數時,可以先不對變數c,d進行初始化56 int c;57 int d;58 OutTest(out c, out d);//c和d的值將會變為OutTest函數中所改變的值,此處輸出c為1,,d為259 Console.WriteLine("c={0};d={1}", c, d);60 Console.ReadLine();61 }62 }63 }
關於c#中”ref”和”out”關鍵字的一些理解