2009-02-20 42 views
3

通常我的方法主要有以下幾點:最佳實踐返回的值(.NET)數組時

public List<int> Method1(int input) 
{ 
    var output = new List<int>(); 
    //add some items to output 
    return output; 
} 

但FxCop的另一個建議IList實現的,而不是名單,但我不記得是哪。該方案包括返回它作爲一個IList,ICollection的或IEnumerable的更多的靈活性,或者一個完全不同的方式如下:

public int[] Method2(int input) 
{ 
    var output = new List<int>(); 
    //add some items to output 
    return output.ToArray(); 
} 

所有替代品的代碼,都提供了和所有的可能性,這被認爲是最好的做法呢?

回答

5
在§8.3.1

「框架設計指南」(第二版)有相當大談收藏的返回值,彙總:

  • 不要提供可設置的集合屬性。
  • DO使用Collection<T>Collection<T>的子類獲取表示讀/寫集合的屬性或返回值。
  • DO使用ReadOnlyCollection<T>ReadOnlyCollection<T>的一個子類,或在極少數情況下IEnumerable<T>屬性或返回值表示只讀集合。

(還有更多,但這三個捕獲核心)。

上述第一個:除非您希望用戶能夠更改它(並且可能您應該有自定義類型以便您擁有一定程度的控制權),否則不要返回內部集合的引用。

我會返回IList<T>並確保我沒有定義我要返回的實際類型,除非我正在返回一個迭代器(當我使用IEnumerable<T>時)。

6

的IEnumerable/IEnumerable的< T>除非特別需要一個列表,那麼你應該返回的IList < T>

+0

我同意,但你可以擴展爲什麼? – mmcdole 2009-02-20 15:55:52

+0

因爲它允許您更改函數內部的實現細節,如果需要的話,不會破壞調用該函數的代碼。 – 2009-02-20 16:04:20

+0

例如,也許現在你實際上返回一個數組,但是在將來的某個時候,你更新代碼返回一個List 來代替。如果你所承諾的只是返回IEnumerable ,調用代碼仍然可以正常工作。 – 2009-02-20 16:05:51

2

返回您在代碼中調用此方法需要的接口。

如果您需要對結果執行列表操作,請返回IList<T>。 如果您只需要枚舉結果,請返回IEnumerable<T>

這些是我最實際使用的那些。 我從來沒有從公共接口返回數組,除非有很好的理由。

3

ReadOnlyCollection<T>是另一種選擇。

+0

但是隻有當你不想給調用者更新列表的機會。無論如何+1你的答案。 – 2009-02-20 16:13:52

1

這取決於。

您是否希望調用者能夠修改項目並讓您看到這些更改?數組可以修改。 IList接口定義修改方法(但實現可能不允許)。

您可以詳細說明FxCop警告嗎?

肯特

1

這取決於您的要求。所有事情都說了,並且通過強類型數組迭代是所有集合類型中速度最快的。如果你不需要調整大小/添加/搜索它們,數組就很好。

1

我幾乎總是用List,因爲它給了我經常發現最有用的方法。

返回IEnumerable的一個潛在負面後果是任何拋出枚舉的異常都會來自可能距實際構建該對象的代碼相當遠的代碼區域,從而使得錯誤跟蹤變得更加困難。

5

Eric Lippert在爲什麼returning an array is usually a bad idea有一個很好的職位。

通常情況下,您應該儘可能一般,不會給任何將要調用您的方法的人造成不必要的悲傷。優先考慮具體類的接口,並選擇最通用的接口。

返回接口可以更好地封裝您的實現,並且將使事情在未來更容易更改。如果你從一個具體的類型開始,你致力於總是返回該類型。

IEnumerable<T>是最好的開始。隨着LINQ的出現,調用者無法輕易完成枚舉的事情就很少。如果來電者偶爾需要一個列表,很容易撥打.ToList()

如果調用者可能有特定的需求來索引返回的集合,或者他們可能想要自己修改集合(插入/刪除/重新排序項目),請考慮使用IList<T>