C#方法的參數 Ref Out Params 4種類型的參數
轉載:http://www.cnblogs.com/kissdodog/archive/2013/05/11/3072815.html
一、按值傳遞參數
值參數是通過將實參的值復制到形參,來實現按值傳遞到方法,也就是我們通常說的按值傳遞。
方法被調用時,CLR做如下操作:
1、在托管堆棧中為形參分配空間;
2、將實參的值復制到形參。
這個太常用了,按值傳遞參數,是復制一份,因此不影響原來參數的值。
public class Program { static void Main(string[] args) { int i = 1; int j = 2; int k = Plus(i,j); Console.WriteLine(i); //輸出 1 Console.WriteLine(j); //輸出 2 Console.WriteLine(k); //輸出 5 Console.ReadKey(); } public static int Plus(int i, int j) { i = i + 1; j = j + 1; return i + j; } }
二、按引用傳遞參數 -- 關鍵字ref
和前面的“按值傳遞”相對應的是按引用傳遞。顧名思義,這裏傳遞的不在是值,而是引用。註意這裏不是傳遞一個復制品了,而是將真實的自己傳到方法中供方法玩弄。
註意點:
1、按引用傳遞的參數,系統不再為形參在托管棧中分配新的內存。
2、此時,形參名其實已經成為實參名的一個別名,它們成對地指向相同的內存位置。
public class Program { static void Main(string[] args) { int i = 1; int j = 2; int k = Plus(ref i,ref j); //實參前也要加ref關鍵字 Console.WriteLine(i); //輸出 2 Console.WriteLine(j); //輸出 3 Console.WriteLine(k); //輸出 5 Console.ReadKey(); } public static int Plus(ref int i, ref int j) //形參錢要加ref關鍵字 { i = i + 1; j = j + 1; return i + j; } }
以上例子與上面的幾乎一樣,只是加了4個ref,留意到,在方法中對參數的修改,會對傳方法的參數的值造成影響。
三、輸出參數 - 關鍵字out
輸出參數和引用參數有一定程度的類似,輸出參數可用於將值從方法內傳遞到方法外,實際上就相當於有多個返回值。要使用輸出參數只需要將引用參數的ref關鍵字替換為out關鍵字即可。但又一點必須註意,只有變量才有資格作為輸出參數,文本值和表達式都不可以,這點要謹記。
註意兩個問題:
1、編譯器允許在方法中的任意位置、任意時刻讀取引用參數的值。
2、編譯器禁止在為輸出參數賦值前讀取它。
這意味著輸出參數的初始值基本上是沒意義的,因為它在使用前要被賦予新的值。因此想通過輸出參數將值傳入方法的路是行不通的。
public class Program { static void Main(string[] args) { int i = 1; int j = 2; int k = Plus(i,out j); //實參前也要加out關鍵字 Console.WriteLine(i); //輸出 1 Console.WriteLine(j); //輸出 100 Console.WriteLine(k); //輸出 102 Console.ReadKey(); } public static int Plus(int i, out int j) { i = i + 1; j = 100; return i + j; } }
四、參數數組 - 關鍵字params
參數數組:
public class Program { static void Main(string[] args) { int count1 = Plus(1); //輸出 1 Console.WriteLine(count1); int count2 = Plus(1, 2, 3);//輸出 6 Console.WriteLine(count2); int count3 = Plus(); //輸出 0 參數數組本身可選,沒傳入值也不會出錯 { Console.WriteLine(count3); } Console.ReadKey(); } public static int Plus(params int[] values) { int count = 0; foreach (int i in values) { count = count + i; } return count; } }
另外再補充兩個C# 4.0的新特性可選參數與命名參數:
1、可選參數
可選參數,顧名思義,它不是必需的。對於一般的參數,如果不為它指定值,可能會導出運行出錯。但是可選參數不會。
可選參數的規則:
1、可選參數不能為參數列表第一個參數,它必須位於所有必選參數之後;
2、可選參數必須指定一個默認值;
3、可選參數的默認值必須是一個常量表達式;
4、所有可選參數以後的參數都必須是可選參數。
public class Program { static void Main(string[] args) { int count1 = Plus(5); //當不指定可選參數時,是默認值 Console.WriteLine(count1); //輸出 15 int count2 = Plus(5,5); //當指定可選參數時,有默認值 Console.WriteLine(count2); //輸出 10 Console.ReadKey(); } public static int Plus(int i, int j = 10) { return i + j; } }
2、命名參數
可選參數解決的是參數默認值的問題,而命名參數解決的是參數順序的問題,命名參數將我們從記憶每個方法數目繁多的參數列表中解放了出來。讓你可以不按順序輸入參數。
public class Program { static void Main(string[] args) { //string str = "字符串"; //int i = 10; //Console.WriteLine(Plus(str:str,i:i)); //雖然很怪異,但這3行代碼是能正常運行的 Console.WriteLine(Plus(str:"字符串",i:10)); //註意順序與方法簽名參數中的不一樣 Console.ReadKey(); } public static string Plus(int i, string str) { return str + i.ToString(); } }
C#方法的參數 Ref Out Params 4種類型的參數