MyClass[] array; List<MyClass> list;
一個比另外一個更可取的狀況是什麼? 又爲何呢? git
在大多數狀況下,使用List
就足夠了。 List
使用內部數組來處理其數據,並在向List
添加比其當前容量更多的元素時自動調整數組的大小,這使其比須要事先了解容量的數組更易於使用。 github
請參閱http://msdn.microsoft.com/zh-cn/library/ms379570(v=vs.80).aspx#datastructures20_1_topic5 ,以獲取有關C#中列表的更多信息,或僅反編譯System.Collections.Generic.List<T>
。 編程
若是須要多維數據(例如,使用矩陣或在圖形編程中使用),則可能會改用array
。 數組
與往常同樣,若是內存或性能成爲問題,請對其進行衡量! 不然,您可能會對代碼作出錯誤的假設。 性能
還沒有說起的另外一種狀況是,當一個項目具備大量項目時,每一個項目都由固定在一塊兒的一束相關但獨立的變量組成(例如,一個點的座標或3d三角形的頂點)。 暴露場結構的數組將容許其元素「就地」被有效地修改,這是任何其餘集合類型都不可能作到的。 因爲結構的數組將其元素連續保存在RAM中,所以對數組元素的順序訪問會很是快。 在代碼須要屢次順序經過數組的狀況下,結構數組的性能可能比數組或類對象引用的其餘集合的性能高2:1; 此外,在適當位置更新元素的能力能夠容許結構陣列賽過任何其餘種類的結構集合。 優化
儘管數組不可調整大小,可是讓代碼存儲數組引用以及正在使用的元素數量並不困難,並根據須要用更大的數組替換數組。 或者,能夠輕鬆地爲行爲相似於List<T>
但暴露其後備存儲的類型編寫代碼,從而令人們能夠說MyPoints.Add(nextPoint);
或MyPoints.Items[23].X += 5;
。 請注意,若是代碼嘗試訪問列表末尾以外的內容,後者不必定會引起異常,可是在概念上,用法與List<T>
很是類似。 編碼
當集合自己的不可變性是客戶端與提供者代碼之間的合同的一部分(不必定是集合中項目的不可變性)而且IEnumerable不適合時, 應優先於List使用數組。 spa
例如, .net
var str = "This is a string"; var strChars = str.ToCharArray(); // returns array
顯然,對「 strChars」的修改不會改變原始的「 str」對象,而與「 str」的基礎類型的實現級知識無關。 設計
可是假設
var str = "This is a string"; var strChars = str.ToCharList(); // returns List<char> strChars.Insert(0, 'X');
在這種狀況下,僅憑該代碼片斷尚不清楚insert方法是否將使原始「 str」對象發生突變。 它須要String的實現級別的知識才能進行肯定,這破壞了「按合同設計」方法。 對於String來講,這沒什麼大不了的,可是在幾乎全部其餘狀況下,這可能都是大問題。 將列表設置爲只讀確實有幫助,但會致使運行時錯誤,而不是編譯時錯誤。
我認爲,與其比較每種數據類型的功能,不如說最實用的答案是:「差別對於您須要完成的工做可能並不那麼重要,尤爲是由於它們都實現了IEnumerable
,所以請遵循流行的約定並使用一個List
直到您有理由不這樣作爲止,這時您可能有理由在List
使用數組。」
在大多數狀況下,在託管代碼中,您會傾向於儘量使集合易於使用,而沒必要擔憂微優化。
實際上,不多要使用數組。 每次要添加/刪除數據時,請絕對使用List<T>
,由於調整數組的大小很是昂貴。 若是您知道數據是固定長度的,而且出於某些很是特定的緣由(基準化以後)想要進行微優化,則數組可能會有用。
List<T>
提供了更多的功能比的陣列(儘管LINQ找齊它一點),而且幾乎老是正確的選擇。 固然,除了params
參數。 ;-p
做爲計數器List<T>
是一維的; 位置-如您有int[,]
或string[,,]
類的矩形(etc)數組-可是在對象模型中還有其餘建模此類數據(若是須要)的方法。
也能夠看看:
也就是說,我在protobuf-net項目中大量使用了數組; 徹底出於性能考慮:
byte[]
對於編碼很是重要; byte[]
緩衝區,該緩衝區在向下發送到基礎流(和vv)以前填充; 比BufferedStream
等更快; Foo[]
而不是List<Foo>
),由於一旦創建, List<Foo>
是固定的,而且須要很是快。 但這絕對是一個例外。 對於通常的業務流程處理,每次List<T>
獲勝。