|
|
|
|
|
在前文中,我簡單介紹了C# ref vs out 的區(qū)別,在本文我將繼續(xù)通過多個示例來詳解 C# 中的 ref
與 out
的不同。
C# 中的 ref
和 out
關(guān)鍵字用于在方法或函數(shù)中傳遞參數(shù),兩者都表明參數(shù)是通過引用傳遞的。默認(rèn)情況下,參數(shù)按值傳遞給方法。通過使用這些關(guān)鍵字(ref
和 out
),我們可以通過引用傳遞參數(shù)。
ref 關(guān)鍵字
ref
關(guān)鍵字通過引用傳遞參數(shù),這意味著當(dāng)控制權(quán)返回到調(diào)用方法時,在方法中對此參數(shù)所做的任何更改都將反映在該變量中。
示例代碼
public static string GetNextName(ref int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
static void Main(string[] args)
{
int i = 1;
Console.WriteLine("Previous value of integer i:" + i.ToString());
string test = GetNextName(ref i);
Console.WriteLine("Current value of integer i:" + i.ToString());
}
輸出
out 關(guān)鍵字
out
關(guān)鍵字通過引用傳遞參數(shù)。這與 ref
關(guān)鍵字非常相似。
示例代碼
public static string GetNextNameByOut(out int id)
{
id = 1;
string returnText = "Next-" + id.ToString();
return returnText;
}
static void Main(string[] args)
{
int i = 0;
Console.WriteLine("Previous value of integer i:" + i.ToString());
string test = GetNextNameByOut(out i);
Console.WriteLine("Current value of integer i:" + i.ToString());
}
輸出
ref 和 out 的主要區(qū)別
ref | out |
---|---|
在傳遞給 ref 之前,參數(shù)必須先初始化。 | 在傳遞給 out 之前,不必初始化參數(shù)。 |
在返回到調(diào)用方法之前不需要分配或初始化參數(shù)的值(由 ref 傳遞)。 | 在返回調(diào)用方法之前,被調(diào)用方法需要分配或初始化參數(shù)值(傳遞給out )。 |
當(dāng)調(diào)用的方法也需要修改傳遞參數(shù)時,通過 ref 傳遞參數(shù)值很有用。 | 當(dāng)需要從函數(shù)或方法返回多個值時,向 out 方法聲明參數(shù)很有用。 |
在調(diào)用方法中使用參數(shù)值之前,不必初始化參數(shù)值。 | 參數(shù)值必須在使用前在調(diào)用方法中初始化。 |
當(dāng)我們使用 ref 時,數(shù)據(jù)可以雙向傳遞。 | 當(dāng)我們使用 out 時,數(shù)據(jù)僅以單向方式傳遞(從被調(diào)用方法到調(diào)用方方法)。 |
ref
和 out
在運行時的處理方式不同,而在編譯時的處理方式相同。out
或 ref
參數(shù)傳遞。ref/out 關(guān)鍵字和方法重載
ref
和 out
在運行時的處理方式不同,而在編譯時它們的處理方式相同,因此如果一個方法將參數(shù)作為 ref
而另一個將參數(shù)作為 out
,則不能重載方法。
示例代碼
public static string GetNextName(ref int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
public static string GetNextName(out int id)
{
id = 1;
string returnText = "Next-" + id.ToString();
return returnText;
}
編譯代碼時的輸出:
但是,當(dāng)一個方法采用 ref
或 out
參數(shù)而另一個方法采用相同的參數(shù)但不帶 ref
或 out
時,方法重載是可能的。
示例代碼
public static string GetNextName(int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
public static string GetNextName(ref int id)
{
string returnText = "Next-" + id.ToString();
id += 1;
return returnText;
}
概括
當(dāng)我們想要在作為參數(shù)傳遞的相同變量中返回一個值時,out
和 ref
關(guān)鍵字很有用。
參考文章:
相關(guān)文章