c#中out和ref的用法與區別

一、相同之處

      ref和out都對函數參數採用引用傳遞形式——不管是值類型參數還是引用類型參數,並且定義函數和調用函數時都必須顯示生命該參數爲ref/out形式。兩者都可以使函數傳回多個結果。

二、不同之處

      兩種參數類型的設計思想不同,ref的目的在於將值類型參數當作引用型參數傳遞到函數,是函數的輸入參數,並且在函數內部的任何改變也都將影響函數外部該參數的值;而out的目的在於獲取函數的返回值,是輸出參數,由函數內部計算得到的值再回傳到函數外部,因此必須在函數內部對該參數賦值,這將沖掉函數外部的任何賦值,使得函數外部賦值毫無意義。

      具體表現爲:

1、out必須在函數體內初始化,這使得在外面初始化變得沒意義。也就是說,out型的參數在函數體內不能得到外面傳進來的初始值。
2、ref必須在函數體外初始化。
3、兩者在函數體內的任何修改都將影響到函數體外面。

三、例子

using System;

namespace ConsoleApplication1
{
class C
{
  public static void reffun(ref string str)
  {
   str += " fun";
  }

  public static void outfun(out string str)
  {
   str = "test";     //必須在函數體內初始, 如無此句,則下句無法執行,報錯
   str += " fun";
  }
}

class Class1
{
  [STAThread]
  static void Main(string[] args)
  {
   string test1 = "test";
   string test2;                  //沒有初始
   C.reffun( ref test1 );     //正確
   C.reffun( ref test2 );     //錯誤,沒有賦值使用了test2
   C.outfun( out test1 );    //正確,但值test無法傳進去
   C.outfun( out test2 );    //正確

   Console.Read();
  }
}
}

(注:此文轉,具體出處不知,稍作修改。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章