標籤:
http://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { /* 先來瞭解一下什麼是實參, 什麼是形參. 所謂形參其實也就是說函數定義的時候所帶的參數. 比如 static void Myfuntion(int i , int t) 其中 int i and int t 都是形參. * 而實參呢? 實參代表的是將要傳入函數裡面進行運算的兩個參數, 可以是變數,也可以是常量.只要與形參類型相同即可*/ // 函數分為傳值與傳址兩種方式. 傳值不影響實參的資料,傳址則會影響實參的資料. 下面用幾段代碼來樣本 //在使用傳值或者傳址的選擇上應當遵循這樣一個規則. //1. 傳值是將形參的內容複寫一份給實參. //2. 傳址是將形參與實參同時指向一個地址. //如果在資料較大的情況下使用傳值的方式必然會影響程式效能, 所以當資料較大時可以使用傳址的方式.使用傳址的方式會讓程式的效率大大提升. static void Myfuntion(int i , int t) //這個函數將以傳值的方式運行 { if (i > t) i += 5; else t += 5; } static void Myfuntion1(ref int i, ref int t) // 這個函數將會以傳址的方式進行運算. 因為前面加了ref關鍵字, 函數只要加了ref關鍵字就會是以傳址的方式進行運算 { if (i > t) i += 5; else t += 5; } static void Myfuntion2(int[] array) //這裡注意, 這個函數沒有帶ref關鍵字, 但是也是以傳址的方式進行運算. 因為在C#中,參考型別都是以傳址的方式進行運算,而array屬於數組, 數組又屬於參考型別,所以.... { for (int i = 0; i < array.Length; i++) { array[i] = 40; } } static void Myfuntion3 (int i , int t , out int s) //這個函數雖然傳回值為Void(代表沒有傳回值) , 其實有傳回值 因為我們加了一個新的關鍵字, out , 這個關鍵字能夠將 s 單獨返回. 同樣out關鍵字也是以傳址的方式進行運算的. 還有,out 參數可以不用賦值,即使你賦值了也會被忽略 { s = 50; if (i > t) i += 5; else t += 5; } static void Main(string[] args) { // 現在我們來使用上面定義的四個函數,看看效果是怎樣的. int a = 10, b = 15, c; //1. 傳值方式的函數 Myfuntion(a, b); // 這個時候a and b 還是等於 10 和 15 , 因為函數中的形參雖然改變結果了. 但是不會影響到實參. Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); // 2. 傳址方式的函數 Myfuntion1(ref a, ref b); //這裡要注意, 函數中使用了ref關鍵字,在調用的時候也要使用ref關鍵字. 此時的結果應該是a = 10 b = 20 因為上面的代碼是傳址方式的, 形參發生了改變也會影響到實參 Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); // 3.隱式的傳址方式函數. int[] My = new int[5]; //定義一個數組並且為它賦值 for (int i = 0; i < My.Length; i++) { My[i] = 30; } // 現在調用函數 Myfuntion2(My); //結果可想而知, my的每一位都會等於 50 foreach (int w in My) { Console.WriteLine(w); Console.WriteLine(); } // 4. out 參數函數 Myfuntion3(a, b, out c); //同樣, 和ref一樣在調用的時候也需要加上關鍵字 Console.WriteLine(c); // c應該會等於 50 //我們試試把C賦值了之後再調用函數,看看會發生什麼. c = 90; Myfuntion3(a, b, out c); Console.WriteLine(c); //還是會等於50; } }}// 下面是運算結果 /* a : 10 and b : 15-------------------a : 10 and b : 20------------------4040404040----------------------50----------------------50 * */
C# 函數的傳值與傳址(轉)