非參考非輸出參數(如局部變量)表示存儲位置。如果存儲位置的類型是引用類型,則存儲位置將持有對該類型實例的引用。
Ref和輸出參數,相反,保持到的存儲位置的參考。該存儲位置可以是局部變量,字段或數組元素。換句話說,ref和out參數引入了另一個間接層。如果在方法中有引用類型的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;
}
輸出參數是有用的:
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參數賦值(如您的示例中所示),那麼您的代碼將無法編譯。