在C#中默認是按值傳遞,什麼是按值傳遞呢?我們都知道,在參數傳遞過程中,形參和實參占有不同位置的存儲空間,被調用過程在執行過程中,改變了形參的值,但不會影響調用過程(主調過程)的實參值。所以,當被調用過程執行結束返回到調用過程,實參還是調用之前的值。因此為了保護實參不受被調用過程的影響,應選用按值傳遞參數方式。 說理論有些抽象,讓我用個簡單的Swap函數給大家說明下吧。
class Program { static void Main(string[] args) { double a, b; Console.WriteLine("請輸入第一個數字a"); a = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("請輸入第二個數字b"); b = Convert.ToDouble(Console.ReadLine()); Swap(a, b); Console.WriteLine("主調用過程按值傳遞後a的值" + a); Console.WriteLine("主調用過程按值傳遞後b的值" + b); Console.Read(); } static void Swap(double x, double y) { double temp; temp = x; x = y; y = temp; Console.WriteLine("被調用過程中a的值" + x); Console.WriteLine("被調用過程中b的值" + y); } }
輸出結果: 通過結果可以發現,a、b的值只在被調用過程中發生改變,在回到主調用過程中後未發生改變。 接著說按引用傳遞。在C#中按引用傳遞需加上關鍵字ref。所謂按引用傳遞就是當調用一個過程時,是把實參變量的內存地址傳遞給被調用過程的形參,也就是說形參和實參使用相同地址的內存單元。因此在被調用過程中改變形參的值,就等於改變了實參的值。 還是讓我們用例子來說明問題吧。還是上面的例子,我稍加修改。
class Program { static void Main(string[] args) { double a, b; Console.WriteLine("請輸入第一個數字a"); a = Convert .ToDouble ( Console.ReadLine()); Console.WriteLine("請輸入第二個數字b"); b =Convert.ToDouble( Console.ReadLine()); Swap(ref a,ref b); Console.WriteLine("主調用過程按引用傳遞後a的值" + a); Console.WriteLine("主調用過程按引用傳遞後b的值" + b); Console.Read(); } static void Swap(ref double x, ref double y) { double temp; temp = x; x = y; y = temp; Console.WriteLine("被調用過程中a的值" + x); Console.WriteLine("被調用過程中b的值" + y); } }
輸出結果: 只是多了個ref,結果就正好相反,這就是代碼的神奇之處。 其實概括起來就一句話,按值傳遞,形參不改變實參;按引用傳遞,形參改變實參。 希望能對大家有幫助。