C# 中 ref,out, params 解析

來源:互聯網
上載者:User

標籤:

方法的參數傳遞有四種類型:傳值(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 解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.