[英]C# Passing reference type directly vs out parameter
我有兩種方法:
public void A(List<int> nums)
{
nums.Add(10);
}
public void B(out List<int> nums)
{
nums.Add(10);
}
這兩個電話有什么區別?
List<int> numsA = new List<int>();
A(numsA);
List<int> numsB = new List<int>();
B(out numsB);
一般來說,我試圖理解傳遞引用類型as-is或out參數之間的區別。
在您的示例中,方法B
將無法編譯,因為out
參數被認為是未初始化的,因此您必須先初始化它,然后才能使用它。 此外,在使用out
參數調用方法時,您需要在調用站點指定out
關鍵字:
B(out numsB);
並且您不需要在調用之前初始化numbsB
變量,因為它將被方法覆蓋。
Jon Skeet有一篇很棒的文章解釋了傳遞參數的各種方法: C#中的參數傳遞
非ref,非out參數(如局部變量)表示存儲位置。 如果存儲位置的類型是引用類型,則存儲位置保存對該類型的實例的引用。
相反,參考和輸出參數保持對存儲位置的引用 。 該存儲位置可以是局部變量,字段或數組元素。 換句話說,ref和out參數引入了另一層間接。 如果方法中有reference-type ref或out參數,則它表示對對象的引用的引用。
為什么要引用對象的引用? 如果您需要修改對象的引用(而不是修改對象本身)。
在某些狹窄的情況下,這是一種有用的技術。 例如,您可能希望編寫一個命令兩個隊列的函數,具體取決於哪個隊列的值較小:
void OrderQueues(ref Queue<int> a, ref Queue<int> b)
{
if (a.Peek <= b.Peek) return;
var temp = a;
a = b;
b = temp;
}
如果要從方法返回多個值,則Out參數很有用:
void OldestAndYoungest(IEnumerable<Person> people, out Person youngest, out Person oldest)
{
youngest = null;
oldest = null;
foreach (var person in people)
{
if (youngest == null || person.Age < youngest.Age)
youngest = person;
if (oldest == null || oldest.Age < person.Age)
oldest = person;
}
}
根據我的經驗,ref和out參數相當罕見,參考類型甚至更少。
請注意,ref參數必須由調用者初始化,而out參數必須由被調用者初始化。 如果您從未為ref參數賦值,則它應該是“正常”參數。 如果您從未為out參數賦值,如示例所示,則代碼將無法編譯。
out關鍵字使參數通過引用傳遞。 這類似於ref關鍵字,除了ref要求在傳遞之前初始化變量。 要使用out參數,方法定義和調用方法都必須顯式使用out關鍵字。 例如:
http://msdn.microsoft.com/en-us/library/t3c3bfhx(v=vs.80).aspx
在版本B中,該函數可以直接訪問變量。 它就像'ref'關鍵字,除了必須從參數中的函數內分配變量。 它允許您從函數返回多個值。 調用語法是'B(out numsB);'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.