2013-08-28 24 views
2

從一個方法返回多個的東西,包括任一:是否有使用C#OUT/ref關鍵字到「返回」> 1項的方法中的益處,而不是一個對象

  • 返回與對象使用了關鍵字屬性或
  • 簡單地修改傳入的參數

是否有使用一個系統或其他好處?我一直在使用對象,但只是發現了out關鍵字,所以想知道我是否應該打擾重構。

+0

任何一種解決方案對於「返回多個價值」都能正常工作,而您選擇的方案完全取決於您的風格和個人情況。 –

+0

我想你可能會得到最好的反饋,如果你發佈了一些你正在使用的代碼,也許發佈在這裏:http://codereview.stackexchange.com/ – dcaswell

+1

你可能想添加一個提及** ref **你的問題也是如此,因爲它們是相同的,除了必須分配**變量**的要求,否則您將收到編譯時錯誤。這就是爲什麼要使用,而不是參考或返回一個對象,因爲其他答案似乎關注。看到我的答案。 –

回答

2

一般來說,如果您要返回的對象是而不是,在您的方法或一組類似方法的返回值之外的其他任何地方使用,這是一個很好的指示,您應該重構。當您需要創建一個特殊的類來簡單地用作方法的返回值時,這意味着您正在解決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集合庫的設計者實現的第二種選擇。

1

我更喜歡使用具有屬性的對象。如果您使用out關鍵字,則需要在其他行中定義它。它不如返回對象清晰;

+1

看起來這是不可能的:http://stackoverflow.com/questions/10073319/returning-anonymous-type-in​​-c-sharp – Baconbeastnz

+1

你是對的,改變了我的答案。 –

3

你不應該費心重構只是爲了利用out parameters。只要結構是可重用的,則返回classstruct將是優選的。

我建議使用的輸出參數的常用用法是返回可能失敗的呼叫狀態。一個例子是int.TryParse

它有可能失敗,因此返回bool可以很容易地確定您是否應該使用out parameter


從方法中返回多個值的另一種可能的解決方案是使用Tuple。他們可以返回n個結果。例如。

public Tuple<bool, bool, string> MyMethod() 
{ 
    return new Tuple<bool, bool, string>(false, true, "yep"); 
} 
+0

感謝Tuple提醒 – wruckie

0

使用out關鍵字的原因是爲了確保方法內部的代碼始終將值設置爲out參數。這是編譯時檢查你打算在函數中做什麼,你做了什麼。

相關問題