1.值類型:
1 static void Main(string[] args) 2 { 3 int a = 5; 4 int b = 3; 5 NumVal(a, b); 6 Console.WriteLine("a={0},b={1}", a, b); //輸出結果為:a=5,b=3 7 8 Console.ReadKey(); 9 } 10 11 12 static void NumVal(int a, int b) 13 { 14 a = a + b; 15 b = a - b; 16 }代碼
值類型被當做參數時,傳遞的是值的副本,所以在下面的方法中修改參數的值並不能影響函數調用中指定的參數的值。
當然也可以為函數定義返回值從而得到一些想要的結果:
1 static void Main(string[] args) 2 { 3 int a = 5; 4 int b = 3; 5 int num1 = NumVal(a, b); 6 int num2 = NumValC(a, b); 7 Console.WriteLine("a={0},b={1}", num1, num2); //輸出結果為:a=8,b=2 8 9 Console.ReadKey(); 10 } 11 12 static int NumVal(int a, int b) 13 { 14 a = a + b; 15 return a; 16 } 17 18 static int NumValC(int a, int b) 19 { 20 b = a - b; 21 return b; 22 }代碼
但是這樣做不好的地方就是不能改變用作參數的多個變量值。(因為函數只有一個返回值)。
2.引用類型(ref):
1 static void Main(string[] args) 2 { 3 int a = 5; 4 int b = 3; 5 NumVal(ref a, ref b); 6 Console.WriteLine("a={0},b={1}", a, b); //輸出結果為:a=8,b=2 7 8 Console.ReadKey(); 9 } 10 11 static void NumVal(ref int a, ref int b) 12 { 13 int c = a; // c=5 14 a = a + b; // a=5+3 15 b = c - b; // b=5-3 16 }代碼
此時可以通過“引用”參數修飾符(即關鍵字 ref)傳遞參數,這樣函數處理與函數調用中使用的變量就是同一個(因為引用類型參數傳遞的是引用的地址),所以在方法中對這個變量進行任何修改都會影響用作參數的變量的值。
但經過 ref 修飾符修飾的變量在用作函數的參數傳遞時必須先初始化,不能在函數中進行初始化操作。
3.輸出類型(out):
1 static void Main(string[] args) 2 { 3 int a; 4 int b; 5 NumVal(out a, out b); 6 Console.WriteLine("a={0},b={1}", a, b); //輸出結果為:a=15,b=4 7 8 Console.ReadKey(); 9 } 10 11 static void NumVal(out int a, out int b) 12 { 13 a = 5;b = 3; // 初始化輸出參數 14 15 int c = a; 16 a = a * b; 17 b = (c + b) / 2; 18 }代碼
out 關鍵字的使用方式和 ref 關鍵字類似,使參數按引用傳遞值。
不同之處:ref 參數在用作參數傳遞時必須先初始化。out 參數則不需要在傳遞之前初始化(就算在傳遞之前已經初始化,在函數裡面也需要重新初始化,忽略傳遞之前初始化的值),但必須在方法結束返回之前賦值。
4.參數數組(params):
1 static void Main(string[] args) 2 { 3 int i = 0; 4 int[] arr = new int[] { 1, 3, 5, 7, 9 }; //可以先定義一個數組對象 5 6 SumVals(ref i, arr); //然後把這個數組對象作為參數傳遞 7 8 Console.WriteLine("總共有{0}個元素!", i); //輸出結果為:總共有5個元素! 9 10 SumVals(ref i, 2, 4, 6, 8, 0); //也可以直接調用 11 12 Console.ReadKey(); 13 } 14 15 static void SumVals(ref int i,params int[] vals) 16 { 17 for (i = 0; i < vals.Length; i++) 18 { 19 Console.WriteLine("第{0}個元素為:{1}", i + 1, vals[i]); 20 } 21 }代碼
C#中函數可以指定一個特定的參數(即 params 修飾的參數數組,只能有一個),且這個參數必須是函數定義中的最後一個參數(即 params 關鍵字後面不允許出現任何其他參數)。
params 修飾的參數數組不指定參數的數量,唯一的限制就是所有的參數類型必須和參數數組是同類型。