C# 函數2 (傳值與傳址)


  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  * */


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM