2014年1月3日 星期五

[C#] 傳值與傳參考的概念

在C# ,一般基本型態都是傳值方式,就算當引數,也是複製一個一模一樣的副本進去,不會改變本來的值。

 class則是傳參考方式 :
calss宣告時,是產生一塊記憶體存放一個指向該類別的位址。
ex. object one = null;

如果產生new 的實體物件,位址就是指向這個實體物件的位址。
ex.  object one = new object();

如果把one當作引數,傳進方法裡面,就等於是把指向實體物件的位址傳進去,
因此該方法改變內容時,實體物件的內容也會跟著改變囉!!!

請看範例 : ^_^


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace 2008
  7. {
  8.    
  9. class Pass
  10.     {
  11.         public static void Value(int param)
  12.         {
  13.             param = 42;
  14.         }
  15.         public static void Reference(WrappedInt param)
  16.         {
  17.             param.Number = 42;
  18.         }
  19.     }
  20.  class WrappedInt
  21.     {
  22.         public int Number;
  23.     }
  24.     class Program
  25.     {
  26.         static void Main(string[] args)
  27.         {
  28.             int i = 0;
  29.             Console.WriteLine(i);
  30.             //參數是傳值,所以會產生一個複製的副本,i依舊是0
  31.             Pass.Value(i);
  32.             Console.WriteLine(i);
  33.             //wi 是指向物件WappedInt的位址
  34.             WrappedInt wi = new WrappedInt();
  35.             Console.WriteLine(wi.Number);
  36.            
  37.             //wi作為引數,wi的位置會複製給param,也就是兩個位址都是指向同一個物件
  38.             Pass.Reference(wi);
  39.             Console.WriteLine(wi.Number);
  40.         }
  41.     }
  42. }

沒有留言:

張貼留言