parameter傳遞方式

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
    
    為變數,不須給予初始值。