2008-12-23 73 views
54

根據FXCop,List不應該暴露在API對象模型中。爲什麼這被認爲是不好的做法?爲什麼公開列表<T>認爲不好?

+4

2008年12月23日我問了這個問題。你鏈接到的問題是2008年12月30日發佈的。我會說我的第一個問題。 – 2014-06-20 13:13:38

回答

48

我同意這裏的駝鹿在這裏:List<T>是一個無約束的,臃腫的對象,它有很多「包袱」。

幸運的是,解決方案很簡單:代之以公開IList<T>

它暴露了具有最重要的是List<T>的方法(用的東西像AddRange()除外)準系統接口,它並不限制你具體List<T>類型,它允許您的API消費者使用自己定製IList<T>的實施者。

要獲得更大的靈活性,請考慮在適當的情況下將某些館藏展示給IEnumerable<T>

3

我認爲你不希望你的消費者在你的回報中添加新元素。一個API應該是清晰和完整的,如果它返回一個數組,它應該返回確切的數據結構。我不認爲這有什麼用每說噸,但而返回>的<而不是[]數組列表直接

+4

-1。特別是,[屬性不應該返回數組](http://msdn.microsoft.com/en-us/library/0fss9skc%28v=VS.100%29.aspx)。儘管方法可能在一般集合中,可枚舉序列和接口對C#來說更具慣用性。沒問題。 – TrueWill 2012-01-07 16:26:02

25

有2個主要原因:

  • 列表<牛逼>是一個相當許多成員在許多情況下都不相關(對於公共對象模型太「忙」)。
  • 該類開封,而並非專爲擴展(也可以不覆蓋任何成員)
+7

沒錯。這裏有關於這個問題的鏈接Krzysztof Cwalina:http://blogs.msdn.com/kcwalina/archive/2005/09/26/474010.aspx – 2008-12-23 02:19:18

5

這只是認爲是不好的做法,如果你正在寫將由成千上萬的開發者使用的API。

.NET框架設計準則適用於Microsoft的公共API。

如果你有一個API沒有被很多人使用,你應該忽略這個警告。

+0

你知道......我只是在那裏錯了...... 我更新我的答案。 – 2008-12-23 03:36:47

+0

那麼......然後我會刪除我的評論,這不再相關。 :) – 2008-12-23 04:45:18

+2

儘管某些FxCop規則是框架設計準則,並且可能不適用於某些項目,但即使爲小型團隊設計的庫也可以從其中受益。你有沒有告訴5個開發者他們將不得不改變他們的項目,因爲你需要對圖書館進行重大改變(比如說@Kaagle提到的觀察變化)?你的團隊中的開發人員是否曾經做過你沒有想到的事情,比如修改你希望爲只讀的列表屬性的內容? – TrueWill 2012-01-07 16:41:55

2

其中一個原因是因爲List不是您可以模擬的東西。即使在不太流行的庫中,由於此推薦,我已經看到用於將List對象公開爲IList的迭代,並且在更高版本中決定不將數據存儲在列表中(可能在數據庫中)。因爲它是一個IList,所以改變客戶端下的實現並不是一個突破性的改變,而是讓每個人都工作。

2

其中一個原因是用戶將能夠更改列表,並且該列表的所有者不會知道這一點,而在某些情況下,它必須在向/從列表添加/刪除項目之後執行一些操作。即使現在不需要,它也可能成爲未來的需求。因此,最好將addXXX/RemoveXXX方法添加到類的所有者中,並將列表暴露給IEnumerable或(我認爲更好)將其公開爲IList,並使用WindowsBase中的ObservableCollection。