1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 class Program 9 { 10 /* 先來了解一下什么是實參, 什么是形參. 11 所謂形參其實也就是說函數定義的時候所帶的參數. 比如 static void Myfuntion(int i , int t) 其中 int i and int t 都是形參. 12 * 而實參呢? 實參代表的是將要傳入函數里面進行運算的兩個參數, 可以是變量,也可以是常量.只要與形參類型相同即可*/ 13 14 // 函數分為傳值與傳址兩種方式. 傳值不影響實參的數據,傳址則會影響實參的數據. 下面用幾段代碼來示例 15 //在使用傳值或者傳址的選擇上應當遵循這樣一個規則. 16 //1. 傳值是將形參的內容復制一份給實參. 17 //2. 傳址是將形參與實參同時指向一個地址. 18 //如果在數據較大的情況下使用傳值的方式必然會影響程序性能, 所以當數據較大時可以使用傳址的方式.使用傳址的方式會讓程序的效率大大提升. 19 static void Myfuntion(int i , int t) //這個函數將以傳值的方式運行 20 { 21 if (i > t) 22 i += 5; 23 else 24 t += 5; 25 } 26 27 static void Myfuntion1(ref int i, ref int t) // 這個函數將會以傳址的方式進行運算. 因為前面加了ref關鍵字, 函數只要加了ref關鍵字就會是以傳址的方式進行運算 28 { 29 if (i > t) 30 i += 5; 31 else 32 t += 5; 33 } 34 35 static void Myfuntion2(int[] array) //這里注意, 這個函數沒有帶ref關鍵字, 但是也是以傳址的方式進行運算. 因為在C#中,引用類型都是以傳址的方式進行運算,而array屬於數組, 數組又屬於引用類型,所以.... 36 { 37 for (int i = 0; i < array.Length; i++) 38 { 39 array[i] = 40; 40 } 41 } 42 43 static void Myfuntion3 (int i , int t , out int s) //這個函數雖然返回值為Void(代表沒有返回值) , 其實有返回值 因為我們加了一個新的關鍵字, out , 這個關鍵字能夠將 s 單獨返回. 同樣out關鍵字也是以傳址的方式進行運算的. 還有,out 參數可以不用賦值,即使你賦值了也會被忽略 44 { 45 s = 50; 46 if (i > t) 47 i += 5; 48 else 49 t += 5; 50 } 51 52 static void Main(string[] args) 53 { 54 // 現在我們來使用上面定義的四個函數,看看效果是怎樣的. 55 int a = 10, b = 15, c; 56 //1. 傳值方式的函數 57 Myfuntion(a, b); // 這個時候a and b 還是等於 10 和 15 , 因為函數中的形參雖然改變結果了. 但是不會影響到實參. 58 Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); 59 60 // 2. 傳址方式的函數 61 Myfuntion1(ref a, ref b); //這里要注意, 函數中使用了ref關鍵字,在調用的時候也要使用ref關鍵字. 此時的結果應該是a = 10 b = 20 因為上面的代碼是傳址方式的, 形參發生了改變也會影響到實參 62 Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); 63 64 // 3.隱式的傳址方式函數. 65 int[] My = new int[5]; //定義一個數組並且為它賦值 66 for (int i = 0; i < My.Length; i++) 67 { 68 My[i] = 30; 69 } 70 // 現在調用函數 71 Myfuntion2(My); //結果可想而知, my的每一位都會等於 50 72 foreach (int w in My) 73 { 74 Console.WriteLine(w); 75 Console.WriteLine(); 76 } 77 78 // 4. out 參數函數 79 Myfuntion3(a, b, out c); //同樣, 和ref一樣在調用的時候也需要加上關鍵字 80 Console.WriteLine(c); // c應該會等於 50 81 //我們試試把C賦值了之后再調用函數,看看會發生什么. 82 c = 90; 83 Myfuntion3(a, b, out c); 84 Console.WriteLine(c); //還是會等於50; 85 } 86 } 87 } 88 // 下面是運算結果 89 90 /* a : 10 and b : 15 91 ------------------- 92 a : 10 and b : 20 93 ------------------ 94 40 95 96 40 97 98 40 99 100 40 101 102 40 103 ---------------------- 104 50 105 ---------------------- 106 50 107 108 * */