簡體   English   中英

為什么C#Arrays使用Enumeration的引用類型,但是List <T> 使用可變結構?

[英]Why do C# Arrays use a reference type for Enumeration, but List<T> uses a mutable struct?

根據我的閱讀,出於性能原因,某些集合的枚舉器類型的設計決策是可變結構而不是引用類型。 List.Enumerator是最知名的。

我正在研究一些使用數組的舊代碼,並且驚訝地發現C#Arrays返回類型SZGenericArrayEnumerator作為它們的通用枚舉器類型,它是一個引用類型。

我想知道是否有人知道為什么當許多其他性能關鍵集合使用可變結構時,Array的通用迭代器被實現為引用類型。

根據我的閱讀,出於性能原因,某些集合的枚舉器類型的設計決策是可變結構而不是引用類型。

好問題。

首先,你是對的。 雖然一般來說,可變值類型是一種糟糕的代碼味道,在這種情況下它們是合理的:

  • 突變幾乎完全隱藏在用戶之外。
  • 任何人都不太可能以混亂的方式使用調查員。
  • 在極其常見的情況下,使用可變值類型實際上確實解決了實際的性能問題。

我想知道是否有人知道為什么當許多其他性能關鍵集合使用可變結構時,Array的通用迭代器被實現為引用類型。

因為如果你是那種擔心枚舉數組性能的人,那你為什么要首先使用枚舉器呢? 這是在上帝的份陣列 ; 只需編寫一個for循環,它會像普通人一樣遍歷其指標,並且永遠不會分配枚舉數。 (或者一個foreach循環;如果它知道循環集合是一個數組,C#編譯器會將foreach循環重寫為等效的for循環。)

你首先從數組中獲取枚舉器的唯一原因是你將它傳遞給一個接受IEnumerator<T> ,在這種情況下, 如果枚舉器是一個結構,那么你將會是無論如何拳擊它 為什么要花費制作值類型然后裝箱呢? 只需將其作為參考類型即可。

數組在C#編譯器中得到一些特殊處理。 當您對它們使用foreach時,編譯器會將其轉換為for循環。 因此使用struct枚舉器沒有性能優勢。

另一方面, List<T>是一個沒有任何特殊處理的普通類,因此使用struct可以獲得更好的性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM