在本文屈暗,你將學(xué)會(huì)C#中 out 和 ref各自的區(qū)別妨蛹,依舊具體使用場景屏富。
共同點(diǎn)
out
、ref
都是傳遞引用(內(nèi)存地址)滑燃,使用后都將改變原來參數(shù)的數(shù)值役听。
不同點(diǎn)
ref
是有進(jìn)有出,out
是只出不進(jìn): ref
可以把參數(shù)的值傳入函數(shù),但無法通過out
把一個(gè)數(shù)值傳入方法中
ref(C# 參考)
ref 關(guān)鍵字使參數(shù)按引用傳遞典予。
當(dāng)調(diào)用方法時(shí)甜滨,在方法中會(huì)對ref傳入的參數(shù)值進(jìn)行改變。若要使用 ref 參數(shù)瘤袖,則方法定義和調(diào)用方法都必須顯式使用 ref 關(guān)鍵字衣摩。
形如
FuncName(ref int i)
,FuncName(ref i)
----前面聲明方法后面調(diào)用方法。
例如:
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0; //先初始化
Method(ref val);
// val is now 44
}
}
傳遞到 ref 參數(shù)的參數(shù)必須最先初始化捂敌。
盡管 ref 和 out 在運(yùn)行時(shí)的處理方式不同艾扮,但在編譯時(shí)的處理方式相同。因此占婉,如果一個(gè)方法采用 ref 參數(shù)泡嘴,而另一個(gè)方法采用 out 參數(shù),則無法重載這兩個(gè)方法逆济。例如酌予,從編譯的角度來看,以下代碼中的兩個(gè)方法是完全相同的奖慌,因此將不會(huì)編譯以下代碼:
class CS0663_Example
{
// Compiler error CS0663: "cannot define overloaded
// methods that differ only on ref and out".
public void SampleMethod(ref int i) { }
public void SampleMethod(out int i) { }
}
但是抛虫,如果一個(gè)方法采用 ref 或 out 參數(shù),而另一個(gè)方法不采用這兩個(gè)參數(shù)简僧,則可以進(jìn)行重載建椰,如下例所示:
class RefOutOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
out(C# 參考)
out 關(guān)鍵字使參數(shù)按引用來傳遞。這與 ref 關(guān)鍵字類似岛马。若要使用 out 參數(shù)棉姐,方法定義和調(diào)用方法都必須顯式使用 out 關(guān)鍵字
形如
FuncName(out int i)
,FuncName(out i)
----前面聲明方法后面調(diào)用方法。
例如:
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void Main()
{
int value;
Method(out value);
// value is now 44
}
}
盡管作為 out 參數(shù)傳遞的變量不必在傳遞之前進(jìn)行初始化蛛枚,但需要在調(diào)用方法前先聲明谅海。