一、相同之處
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();
}
}
}
(注:此文轉,具體出處不知,稍作修改。)