關於c#中”ref”和”out”關鍵字的一些理解

來源:互聯網
上載者:User

標籤:

一. 綜述(本文內容大部分來自網路,經本人整理而成,僅供學習參考,不免理解錯誤,歡迎批評指正)

  1. 在c#中,方法的參數傳遞有四種類型:

  (1) 傳值參數(by value)

    傳值參數無需額外的修飾符。傳值參數在方法調用過程中,如果改變了參數的值,那麼傳入方法的參數在方法調用完成以後並不因此而改變,而是保持原來傳入的值。實際

  上,傳值參數傳遞的是調用參數的一份拷貝,因此在調用方法的過程中,即使改變了參數的值,也不會影響到實際傳入的參數值,詳見常式:

  (2) 傳址參數(by reference)

    傳址參數需要修飾符ref(關鍵字),傳址參數如果在方法的調用過程中改變了參數的值,那麼傳入方法的參數在調用完成以後也隨之改變。傳址參數傳遞的是調用參數的  記憶體位址,該參數在方法內外指向同一個儲存位置。因此,在調用方法過程中如果改變了參數的值,呢麼實際出入的參數值也會隨之改變,詳見常式:  

    • 方法參數上的ref方法參數關鍵字,使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。
    • 若要使用ref參數,必須將參數作為ref參數顯示傳遞到方法;
    • 傳遞到ref參數的參數必須先初始化;
    • 屬性不是變數,不能作為ref參數傳遞;

  (3) 輸出參數(by output)

    輸出參數需要修飾符out(關鍵字)

    • 方法參數上的out方法參數關鍵字,使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變數中。
    • 當希望方法返回多個值時,聲明out方法非常有用。使用out參數的方法仍然可以返回一個值,一個方法可以有一個以上的out參數。
    • 在使用out參數前,不必初始化作為out參數傳遞的變數,然而必須在方法返回之前為out參數賦值。
    • 屬性不是變數,不能做為out參數傳遞。

  (4)數組參數(by array)

    數組參數需要修飾符params。

  2. ref關鍵字與out關鍵字的區別

    在c#中,既可以通過值也可以通過引用傳遞參數。通過引用傳遞參數允許函數成員更改參數的值,並保持更改,若要通過引用傳遞參數,可使用ref和out關鍵字。ref和   out都可以提供相似的功效,其作用也很想c中的指標變數。它們的區別是:

  (1)使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。

  (2)使用ref和out時,在方法的參數和執行方法時,都要加ref或out關鍵字,以滿足匹配。

      (3)out適合用在需要return多個傳回值的地方,而ref則用在需要被調用的方法修改修改調用者的引用的時候。

二. 常式

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Collections; 6  7 namespace ConsoleApplication5 8 { 9     class Program10     {11         //使用普同傳值參數的函數12         static void ValueTest(int x, int y)13         {14             x = 3;15             y = 3;16         }17 18         //使用ref傳址參數的函數19         static void RefTest(ref int x, ref int y)20         {21             x = 1;22             y = x;23         }24 25         //使用out輸出參數的函數26         static void OutTest(out int x, out int y)27         {28             //離開這個函數前,必須對x和y賦值,否則會報錯29             //y = x;30             //上面這行會報錯,因為使用了out後,x和y都清空了,需要重新賦值,即使調用函數前賦過值也不行31             x = 1;32             y = 2;33         }34 35         static void Main(string[] args)36         {37             /************測試普通的傳值參數*******************/38             int a = 4;39             int b = 7;40             ValueTest(a, b);//調用該函數不會改變變數a,b的值41             Console.WriteLine("a={0};b={1}", a, b);//此處輸出a,b的值分別為4,742 43             /************測試“ref”*******************/44             //int m;45             //int n;46             //RefTest(ref m, ref n);47             //上面這行會出錯,ref使用前,變數m,n必須賦值48 49             int o = 11;50             int p = 22;51             RefTest(ref o, ref p);52             Console.WriteLine("m={0};n={1}", o, p);//o和p的值將會變為RefTest函數中所改變的值,此處輸出o為1,,p為153 54             /************測試普通的傳值參數*******************/55             //使用out參數時,可以先不對變數c,d進行初始化56             int c;57             int d;58             OutTest(out c, out d);//c和d的值將會變為OutTest函數中所改變的值,此處輸出c為1,,d為259             Console.WriteLine("c={0};d={1}", c, d);60             Console.ReadLine();61         }62     }63 }

 

關於c#中”ref”和”out”關鍵字的一些理解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.