parameter傳遞方式
parameter傳遞方式
1.Call By Value (傳值呼叫) [預設]
- 方法A的實引數(可為變數、常數、運算子)與被呼叫方法B的虛引數,兩者占用不相同的記憶位址,所以互相獨立、不受影響。
private static void CallValue(int x,int y) { int z; x = 20; y = 30; Console.WriteLine("方法內 交換前:x={0},y={1}",x,y); z = x; x = y; y = z; Console.WriteLine("方法內 交換後:x={0},y={1}",x,y); } static void Main(string[] arg) { int a = 10; int b = 20; Console.WriteLine("呼叫敘述前:a={0},b={1}",a,b); CallValue(a,b); Console.WriteLine("呼叫敘述後:a={0},b={1}",a,b); } ///// //呼叫敘述前:a=10,b=20 //方法內 交換前:x=20,y=30 //方法內 交換後:x=30,y=20 //呼叫敘述後:a=10,b=20
2.Call By Reference (參考呼叫)
- 在方法A實引數與被呼叫方法B虛引數,每個引數前加上"ref",能將實引數與虛引數對應的參數設成相同的記憶位址。
- 實引數必須為變數,並且有初始值。
private static void CallRef(ref int x,ref int y) { int z; x = 20; y =30; Console.WriteLine("方法內 交換前:x:{0},y:{1}",x,y); z = x; x = y; y = z; Console.WriteLine("方法內 交換後:x:{0},y:{1}",x,y); } static void Main(string[] arg) { int a = 10; int b = 20; Console.WriteLine("呼叫敘述前:a:{0},b:{1}",a,b); CallRef(ref a,ref b); Console.WriteLine("呼叫敘述後:a:{0},b:{1}",a,b); } ////// //呼叫敘述前:a:10,b:20 //方法內 交換前:x:20,y:30 //方法內 交換後:x:30,y:20 //呼叫敘述後:a:30,b:20
3.Output parameter (傳出參數)
- 在方法A實引數與被呼叫方法B虛引數,每個引數前加上"out",實引數與虛引數共用相同的記憶位址。
- 實引數必須
private static CallOut(out int x,out int y) { int z; x = 20; y = 30; Console.WriteLine("方法內 交換前 x:{0},y:{1}",x,y); z = x; x = y; y = z; Console.WriteLine("方法內 交換後 x:{0},y:{1}",x,y); } static void Main(string[] args) { int a,b; Console.WriteLine("呼叫敘述前 a,b未給予初始值"); CallOut(out a,out b); Console.WriteLine("呼叫敘述後 a:{0},b:{1}",a,b); } /////// //呼叫敘述前 a,b未給予初始值 //方法內 交換前 x:20,y:30 //方法內 交換前 x:30,y:20 //呼叫敘述後 a:30,b:20