全面分析C#方法中的ref和out

來源:互聯網
上載者:User

關於C#方法中的REF和OUT大家應該並不陌生吧,今天和大家一起來探討它們的使用。

ref    
    通常我們向方法中傳遞的是值.方法獲得的是這些值的一個拷貝,然後使用這些拷貝,當方法運行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞參數的形式,引用(ref)和輸出(out).
    有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引用是一個變數,他可以訪問原來變數的值,修改引用將修改原來變數的值.變數的值儲存在記憶體中,可以建立一個引用,他指向變數在記憶體中的位置.當引用被修改時,修改的是記憶體中的值,因此變數的值可以將被修改.當我們調用一個含有引用參數的方法時,方法中的參數將指向被傳遞給方法的相應變數,因此,我們會明白,為什麼當修改參數變數的修改也將導致原來變數的值.
    建立參數按引用傳遞的方法,需使用關鍵字ref.例;
    using System;
    class gump
    {
 public double square(ref double x)
 {
  x=x*x;
  return x;
 }
    }

    class TestApp
    {
 public static void Main()
 {
  gump doit=new gump();

  double a=3;
  double b=0;

  Console.WriteLine(\"Before square->a={0},b={1}\",a,b);

  b=doit.square(ref a);
  Console.WriteLine(\"After square->a={0},b={1}\",a,b);
 }
    }

    通過測試,我們發現,a的值已經被修改為9了.

out
    通過指定傳回型別,可以從方法返回一個值,有時候(也許還沒遇到,但是我們應該有這麼個方法),需要返回多個值,雖然我們可以使用ref來完成,但是C#專門提供了一個屬性類型,關鍵字為out.介紹完後,我們將說明ref和out的區別.
    using System;
    class gump
    {
 public void math_routines(double x,out double half,out double squared,out double cubed)
 //可以是:public void math_routines(//ref double x,out double half,out double squared,out double cubed)
 //但是,不可以這樣:public void math_routines(out double x,out double half,out double squared,out double cubed),對本例來說,因為輸出的值要靠x賦值,所以x不能再為輸出值
 {
  half=x/2;
  squared=x*x;
  cubed=x*x*x;
 }
    }

    class TestApp
    {
 public static void Main()
 {
    gump doit=new gump();

    double x1=600;
    double half1=0;
    double squared1=0;
    double cubed1=0;
    [Page]
    /*
     double x1=600;
     double half1;
     double squared1;
     double cubed1;
    */

    Console.WriteLine(\"Before method->x1={0}\",x1);
    Console.WriteLine(\"half1={0}\",half1);    Console.WriteLine(\"squared1={0}\",squared1);
    Console.WriteLine(\"cubed1={0}\",cubed1);

 

    doit.math_rountines(x1,out half1,out squared1,out cubed1);
    
    Console.WriteLine(\"After method->x1={0}\",x1);
    Console.WriteLine(\"half1={0}\",half1);
    Console.WriteLine(\"squared1={0}\",squared1);
    Console.WriteLine(\"cubed1={0}\",cubed1);
 }
    }

    通過使用out關鍵字,我們改變了三個變數的值,也就是說out是從方法中傳出值.

    我們發現,ref和out似乎可以實現相同的功能.因為都可以改變傳遞到方法中的變數的值.但是,二者本質本質的區別就是,ref是傳入值,out是傳出值.在含有out關鍵字的方法中,變數必須由方法參數中不含out(可以是ref)的變數賦值或者由全域(即方法可以使用的該方法外部變數)變數賦值,out的宗旨是保證每一個傳出變數都必須被賦值.
    上面代碼中被/**/注釋掉的部分,可以直接使用.也就是說,在調用方法前可以不初始設定變數.但是\"x1\"是要賦值的,否則要報錯.而ref參數,在傳遞給方法時,就已經是還有值的了,所以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.