天天看點

C# 函數的傳值與傳址

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
 ------------------
 40
 
 40
 
 40
 
 40
 
 40
 ----------------------
 50
 ----------------------
 50 
 
  * */
           
c#