-
in型引數
in型引數通過值傳遞的方式將數值傳入方法中。即我們在Java中常見的方法 -
ref型引數
該種型別的引數傳遞變數地址給方法(引用傳遞),傳遞前變數必須初始化。
該型別與out型的區別在與:
1).ref型傳遞變數前,變數必須初始化,否則編譯器會報錯,而out型則不需要初始化
2).ref型傳遞變數,數值可以傳入方法中,而out型無法將資料傳入方法中。換而言之,ref型有進有出,out型只出不進。 -
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型無法將變數的值傳入。但可以將變數的地址傳入併為該地址上的變數賦值。