一、參數的一般傳遞方式
在c#中,除非使用ref或者out前綴,所有參數都通過值來傳遞。變量的棧數據會完整復制到目標參數中。分為以下3種情況:
1、 引用類型的變量只包含對象所在的內存地址,將要復制的是內存地址而不是對象本身,所以對底層對象的修改會保留。如果在方法內部將內存地址指向一個新對象,
則方法結束後在方法中所作的修改會被丟棄。
1 class Program
2
3 {
4
5 static void Main(string[] args)
6
7 {
8
9 Employee myE = new Employee() { id=4};
10
11 Console.WriteLine("初始化為:"+myE.id);
12
13 testMethod(myE);
14
15 Console.WriteLine("退出方法後:"+myE.id);
16
17 Console.ReadLine();
18
19 }
20
21 static void testMethod(Employee myE)
22
23 {
24
25 //myE.id = 5;
26
27 myE = new Employee() { id = 5 };
28
29 Console.WriteLine("更改為:"+myE.id);
30
31 }
32
33 }
34
35 class Employee
36
37 {
38
39 public int id { get; set; }
40
41 }
該程序輸出為
2、 值類型對象包含的是實際數據,傳遞給方法的是數據本身的副本,對值類型對象的修改在方法結束後會被丟棄。
3、String類型在實際使用中當做值類型對待。
二、參數的特殊傳遞方式
1、ref參數
作用:迫使值參數通過引用傳送給方法。
2、out參數
作用:在參數未初始化的情況下,在一個函數中輸出多個值。隱含ref。C#要求變量在被引用前必須初始化。盡管在傳遞前,可以用沒有意義的值初始化他們,
然後用ref引用傳遞,但有時會引起混亂。用out可以使參數在未初始化情況下使用,邏輯性更強。
3、params數量可變參數
作用:自動把參數轉為數組。調用方法有兩種,見示例。
1 static string Combine(params string[] paths)
2
3 {
4
5 string result = string.Empty;
6
7 foreach (string path in paths)
8
9 {
10
11 result = System.IO.Path.Combine(result, path);
12
13 }
14
15 return result;
16
17 }
18
19 static void test()
20
21 {
22
23 //調用方法1,直接輸入,如果不使用params前綴就不能用這種方式
24
25 string path1 = Combine("", "", "");
26
27 //調用方法2,string數組,不使用params前綴也能用這種方式
28
29 string path2 = Combine(new string[] {"","","" });
30
31 }
三、傳遞參數注意事項:
1、 屬性不是變量,因此不能傳給out 或ref參數
2、 除非使用out前綴,所有參數必須在使用前初始化。
3、 out參數必須在函數結束前賦值,賦值null也可以。
摘自 追風小子