根據FXCop,List不應該暴露在API對象模型中。爲什麼這被認爲是不好的做法?爲什麼公開列表<T>認爲不好?
回答
我同意這裏的駝鹿在這裏:List<T>
是一個無約束的,臃腫的對象,它有很多「包袱」。
幸運的是,解決方案很簡單:代之以公開IList<T>
。
它暴露了具有最重要的是List<T>
的方法(用的東西像AddRange()
除外)準系統接口,它並不限制你具體List<T>
類型,它允許您的API消費者使用自己定製IList<T>
的實施者。
要獲得更大的靈活性,請考慮在適當的情況下將某些館藏展示給IEnumerable<T>
。
我認爲你不希望你的消費者在你的回報中添加新元素。一個API應該是清晰和完整的,如果它返回一個數組,它應該返回確切的數據結構。我不認爲這有什麼用每說噸,但而返回>的<而不是[]數組列表直接
-1。特別是,[屬性不應該返回數組](http://msdn.microsoft.com/en-us/library/0fss9skc%28v=VS.100%29.aspx)。儘管方法可能在一般集合中,可枚舉序列和接口對C#來說更具慣用性。沒問題。 – TrueWill 2012-01-07 16:26:02
有2個主要原因:
- 列表<牛逼>是一個相當許多成員在許多情況下都不相關(對於公共對象模型太「忙」)。
- 該類開封,而並非專爲擴展(也可以不覆蓋任何成員)
沒錯。這裏有關於這個問題的鏈接Krzysztof Cwalina:http://blogs.msdn.com/kcwalina/archive/2005/09/26/474010.aspx – 2008-12-23 02:19:18
這只是認爲是不好的做法,如果你正在寫將由成千上萬的開發者使用的API。
.NET框架設計準則適用於Microsoft的公共API。
如果你有一個API沒有被很多人使用,你應該忽略這個警告。
你知道......我只是在那裏錯了...... 我更新我的答案。 – 2008-12-23 03:36:47
那麼......然後我會刪除我的評論,這不再相關。 :) – 2008-12-23 04:45:18
儘管某些FxCop規則是框架設計準則,並且可能不適用於某些項目,但即使爲小型團隊設計的庫也可以從其中受益。你有沒有告訴5個開發者他們將不得不改變他們的項目,因爲你需要對圖書館進行重大改變(比如說@Kaagle提到的觀察變化)?你的團隊中的開發人員是否曾經做過你沒有想到的事情,比如修改你希望爲只讀的列表屬性的內容? – TrueWill 2012-01-07 16:41:55
其中一個原因是因爲List不是您可以模擬的東西。即使在不太流行的庫中,由於此推薦,我已經看到用於將List對象公開爲IList的迭代,並且在更高版本中決定不將數據存儲在列表中(可能在數據庫中)。因爲它是一個IList,所以改變客戶端下的實現並不是一個突破性的改變,而是讓每個人都工作。
其中一個原因是用戶將能夠更改列表,並且該列表的所有者不會知道這一點,而在某些情況下,它必須在向/從列表添加/刪除項目之後執行一些操作。即使現在不需要,它也可能成爲未來的需求。因此,最好將addXXX/RemoveXXX方法添加到類的所有者中,並將列表暴露給IEnumerable或(我認爲更好)將其公開爲IList,並使用WindowsBase中的ObservableCollection。
- 1. 爲什麼System.Web.Http.OData不公開?
- 2. 爲什麼公開底層表示的迭代器不好?
- 3. 爲什麼追加到列表不好?
- 4. 爲什麼認爲深度超過2時認爲不好?
- 5. ASP.NET MVC:爲什麼`ToMvcHtmlString`不公開?
- 6. 爲什麼不將HashAlgorithm.Dispose公開?
- 7. 爲什麼列表<String>不被接受爲列表<Object>?
- 8. 爲什麼要宣佈成員公開而不是公開?
- 9. 爲什麼我不能做列表<X<Long>>作爲列表的參數<X<?>>
- 10. 爲什麼列表不變?
- 11. 爲什麼財產製定者默認公開
- 12. 爲什麼使用短PHP標籤會被認爲不好?
- 13. 嵌套重量的線性佈局,爲什麼認爲不好?
- 14. 爲什麼$在cakePHP中被認爲是不好的做法?
- 15. 爲什麼before_save被認爲是不好的?
- 16. 爲什麼我不能從列表<MyClass>轉到列表<object>?
- 17. 爲什麼列表<Number>不是列表<Object>的子類型?
- 18. 爲什麼我的向量<int>不是默認爲0?
- 19. 爲什麼InitializeComponent是公開的
- 20. 爲什麼jQuery庫公開DOM元素?
- 21. 爲什麼globals不好?
- 22. 爲什麼這不好?
- 23. 爲什麼performSelector:onThread:不好?
- 24. 爲什麼require_once不好用?
- 25. 爲什麼System.out.println不好?
- 26. 爲什麼#define不好?
- 27. 爲什麼seq不好?
- 28. 爲什麼列表爲空?
- 29. 爲什麼不是默認
- 30. 爲什麼std :: sub_match <T>公開繼承std :: pair <T, T>?
2008年12月23日我問了這個問題。你鏈接到的問題是2008年12月30日發佈的。我會說我的第一個問題。 – 2014-06-20 13:13:38