方法中引數的型別詳細

守望陽光01發表於2017-07-28
  1. in型引數 
    in型引數通過值傳遞的方式將數值傳入方法中。即我們在Java中常見的方法

  2. ref型引數 
    該種型別的引數傳遞變數地址給方法(引用傳遞),傳遞前變數必須初始化。 
    該型別與out型的區別在與: 
    1).ref型傳遞變數前,變數必須初始化,否則編譯器會報錯,而out型則不需要初始化 
    2).ref型傳遞變數,數值可以傳入方法中,而out型無法將資料傳入方法中。換而言之,ref型有進有出,out型只出不進。

  3. out型引數 
    與ref型類似,僅用於傳回結果。 
    注意: 
    1). out型資料在方法中必須要賦值,否則編譯器會報錯。 
    eg:如下圖若將程式碼中的sum1方法的方法體 
    改為 a+=b;則編譯器會報錯。原因:out型只出不進,在沒給a賦值前是不能使用的 
    改為 b+=b+2;編譯器也會報錯。原因:out型資料在方法中必須要賦值。 
    2). 過載方法時若兩個方法的區別僅限於一個引數型別為ref 另一個方法中為out,編譯器會報錯 
    eg:如下圖若將程式碼中 
    方法名sum1 改為sum(或者將方法名sum改為sum1),編譯器會報錯。 
    Error 1 Cannot define overloaded method ‘sum’ because it differs from another method only on ref and out 
    原因:引數型別區別僅限於 為ref 與為out 時,若過載對編譯器而言兩者的後設資料表示完全相同。

具體區別見程式碼

class C
    {
        //1. in型引數
        public void sum(int a, int b) {
            a += b;
        }
        //2. ref型引數
        public void sum(ref int a, int b)
        {
            a += b;
        }
        //3. out型引數
        public void sum1(out int a, int b)
        {
            a = b+2;
        }
        public static void Main(string[] args)
        {
            C c = new C();
            int a = 1, b = 2;
            c.sum(a,b);
            Console.WriteLine("a:{0}", a);
            a = 1; b = 2;
            c.sum(ref a, b);
            Console.WriteLine("ref a:{0}", a);
            a = 1; b = 2;
            c.sum1(out a, b);
            Console.WriteLine("out a:{0}", a);
        }
    }

輸出結果: 
輸出結果 
從程式碼也可以看出,in型引數為值傳遞,所以當將變數a傳入方法時,變數a的值並不會發生變化。而ref型引數,由於是引用傳遞,將變數的值和地址都傳入方法中故變數值改變。out型無法將變數的值傳入。但可以將變數的地址傳入併為該地址上的變數賦值。

相關文章