首先:兩者都是按位址傳遞的,使用後都将改變原來參數的數值。
其次:ref可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值為空,是以你必須初始化一次。這個就是兩個的差別,或者說就像有的網友說的,ref是有進有出,out是隻出不進。
out:
class Program
{
/*
* out、ref都是引用傳遞,傳遞後使用都會改變原有的值
* out是隻出不進。ref是有進有出,
*
* out用法,一般用于需要傳回多個參數時,如在需要傳回分頁的資料時 同時傳回總條數或者TryParse()會用到
* ref用法,一般用于在改變一個參數時,把他的改變反應到變量中 如在遞歸中
*
*/
#region Out
static void Main(string[] args)
{
Program p = new Program();
//out傳遞參數時不用指派(如果指派也會被清空)
string out_s;
p.out_func(out out_s);
Console.WriteLine(out_s);
Console.ReadLine();//暫停視窗
}
/// <summary>
/// out傳入後需要指派才能傳回
/// </summary>
/// <param name="i"></param>
public void out_func(out string s)
{
s = "out參數已指派,傳回。";
}
#endregion
}
ref:
class Program
{
#region ref
static void Main(string[] args)
{
Program p = new Program();
//ref傳遞時如果未初始化指派 則會報錯 :使用了未指派的局部變量“ref_s”
string ref_s = "已初始化。";
p.ref_func(ref ref_s);
Console.WriteLine("傳回的ref參數:" + ref_s);
Console.ReadLine();//暫停視窗
}
/// <summary>
/// ref傳入前需要指派,傳入後可不做操作傳回原值
/// </summary>
/// <param name="s"></param>
public void ref_func(ref string s)
{
Console.WriteLine("傳入的ref參數:" + s);
s += "已指派傳回。";
}
#endregion
}
總結起來ref與out差别就是:
- ref在傳給方法前需要初始化,out不需要。
- out在方法内必須被指派,否則會出現編譯錯誤。
- out在傳給方法時會被還原至未初始化狀态,是以在方法執行前對out參數進行初始化和不進行的效果上是一樣的。