簡體   English   中英

C#直接傳遞引用類型vs out參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM