從一個方法返回多個的東西,包括任一:是否有使用C#OUT/ref關鍵字到「返回」> 1項的方法中的益處,而不是一個對象
- 返回與對象使用了關鍵字屬性或
- 簡單地修改傳入的參數
是否有使用一個系統或其他好處?我一直在使用對象,但只是發現了out關鍵字,所以想知道我是否應該打擾重構。
從一個方法返回多個的東西,包括任一:是否有使用C#OUT/ref關鍵字到「返回」> 1項的方法中的益處,而不是一個對象
是否有使用一個系統或其他好處?我一直在使用對象,但只是發現了out關鍵字,所以想知道我是否應該打擾重構。
一般來說,如果您要返回的對象是而不是,在您的方法或一組類似方法的返回值之外的其他任何地方使用,這是一個很好的指示,您應該重構。當您需要創建一個特殊的類來簡單地用作方法的返回值時,這意味着您正在解決C#無法從方法返回多個值的問題,因此out
關鍵字可能是您的一個非常好的選擇。另一方面,如果在其他地方使用多部分返回值(例如將其存儲在集合中或作爲參數傳遞給其他方法),則可能不需要重構,因爲返回對象是有意義的。
比較這兩種方法:
interface DictionaryReturn<T> {
T Value {get;}
bool Success {get;}
}
...
class Dictionary<K,V> {
...
public DictionaryReturn<V> TryGetValue(K key) {
...
}
}
或
class Dictionary<K,V> {
...
public bool TryGetValue(K key, out V res) {
...
}
}
第一種情況介紹了一種特殊DictionaryReturn<T>
類,它提供的值和該值是在詞典中找到的一個指標。如果有的話,很少有理由在TryGetValue
的調用之外存儲或使用DictionaryReturn<T>
對象,因此第二種方法更好。毫不奇怪,這是.NET集合庫的設計者實現的第二種選擇。
我更喜歡使用具有屬性的對象。如果您使用out
關鍵字,則需要在其他行中定義它。它不如返回對象清晰;
看起來這是不可能的:http://stackoverflow.com/questions/10073319/returning-anonymous-type-in-c-sharp – Baconbeastnz
你是對的,改變了我的答案。 –
你不應該費心重構只是爲了利用out parameters
。只要結構是可重用的,則返回class
或struct
將是優選的。
我建議使用的輸出參數的常用用法是返回可能失敗的呼叫狀態。一個例子是int.TryParse
。
它有可能失敗,因此返回bool
可以很容易地確定您是否應該使用out parameter
。
從方法中返回多個值的另一種可能的解決方案是使用Tuple
。他們可以返回n個結果。例如。
public Tuple<bool, bool, string> MyMethod()
{
return new Tuple<bool, bool, string>(false, true, "yep");
}
感謝Tuple提醒 – wruckie
使用out關鍵字的原因是爲了確保方法內部的代碼始終將值設置爲out參數。這是編譯時檢查你打算在函數中做什麼,你做了什麼。
任何一種解決方案對於「返回多個價值」都能正常工作,而您選擇的方案完全取決於您的風格和個人情況。 –
我想你可能會得到最好的反饋,如果你發佈了一些你正在使用的代碼,也許發佈在這裏:http://codereview.stackexchange.com/ – dcaswell
你可能想添加一個提及** ref **你的問題也是如此,因爲它們是相同的,除了必須分配**變量**的要求,否則您將收到編譯時錯誤。這就是爲什麼要使用,而不是參考或返回一個對象,因爲其他答案似乎關注。看到我的答案。 –