標籤:
方法的參數傳遞有四種類型:傳值(by value),傳址(by reference),輸出參數(by output ),數組參數(by array)。
傳值參數無須額外的修飾符,傳址參數需要修飾符ref,輸出參數需要修飾符out,數組參數需要修飾符params。
例1:
public static void method(string x,ref string y,out string z){x="我是傳實值型別";y="我是傳址類型,傳入的參數必須先被初始化";z="我是輸出參數,必須在方法中對我完成初始化";}static void Main(){string a="傳實值型別",b="傳址類型",c;Console.WriteLine("before method call:a={0},b={1},c=未賦值",a,b);method(a,ref b,out c);Console.WriteLine("after method call:a={0},b={1},c={3}",a,b,c);}View Code
輸出結果如下:
可以看到a的值始終不變,b和c的值改變了。
例2:
public static void bubble(int x,int y) { int temp = x; x = y; y = temp; } static void Main() { int a = 5, b = 6; bubble(a,b); Console.WriteLine("value is :a={0},b={1}",a,b); }View Code
輸出結果:
public static void bubble(ref int x,ref int y) { int temp = x; x = y; y = temp; } static void Main() { int a = 5, b = 6; bubble(ref a,ref b); Console.WriteLine("value is :a={0},b={1}",a,b); }View Code
輸出結果:
用冒泡演算法來看,很明顯的,使用了ref關鍵字的函數調用以後,a的b的值變化了。而沒有使用ref的沒有變化。
例3:
static string outvalue(out string name) { string name1 = "蠟筆小新"; name = name1; string name2 = "小色鬼"; return name2; } static void Main() { string name = "小新"; Console.WriteLine("before call:{0}", name); string result = outvalue(out name); Console.WriteLine("after call:{0}", name); Console.WriteLine("finally return:{0}", result); }View Code
輸出結果:
例4:
static void pararry(params object[] list) { for (int i = 0; i < list.Length; i++) { Console.WriteLine(list[i]); } } static void array(object[] list) { foreach (object _list in list) { Console.WriteLine(_list); } } static void Main() { object[] arr = new object[] { 1, "a", "b" }; pararry("a", "b", "c", "...", "n");//傳遞多個參數,多個object數組 pararry(arr);//將數組arr作為值參數傳遞 array(arr);//傳遞一個參數,這個參數是一個數組 } View Code
輸出結果:
注意:paras型別參數主要用於在對數組長度未知(可變)的情況下進行函式宣告。在方法聲明中只允許一個paras關鍵字,並且該關鍵字只能為最後一個。
總結:
通過引用傳遞參數允許函數成員更改參數的值,並保持該更改。
ref和out這兩個關鍵字的區別是:
1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足匹配。
3、out適合用在需要retrun多個傳回值的地方,而ref則用在需要被調用的方法修改調用者的引用的時候。
ref、out與params,ref是引用方法內的參數影響結果;out是引用方法中參數返回結果到主方法;而params是將可變同類參數(即數組)傳入參數。使用中ref用於需要調用引用方法內的資料的。out用於利用引用方法對主方法進行操作,而prarams用於參數長度未知的情況。
轉自 http://blog.163.com/[email protected]/blog/static/801797122010815113152548/
C# 中 ref,out, params 解析