簡體   English   中英

C#泛型如何影響具有基元的集合

[英]How does C# generics affect collections with primitives

據我了解,C#/ .Net泛型支持某種程度的具體化。 所以,如果我有以下代碼:

List<int> list = new List<int>();
list.Add(1);

值1是自動裝箱還是'list'對象會有效地處理原始int?

不,它不會被裝箱。 在執行時, List<int>的后備數組將真正是一個int[] 請注意,這不僅僅是真正原始類型的情況 - List<T>不會對任何值類型的框值(假設它已被聲明為List<Guid> etc而不是List<object> )。

基本上,.NET中的泛型比Java中更多地保留了他們的信息--CLR本身理解泛型並適當地處理它們,而不是在Java中,JVM幾乎不了解它們。

例如,如果你寫:

object list = new List<string>();
Type type = list.GetType();

然后type將等於typeof(List<string>) - 然后它與(例如) List<Guid>等不同。

int值不會在列表中裝箱。 這是泛型的美女之一,編譯器(更確切地說是JIT編譯器,我相信)將構造List<>類的類型化版本 ,而不是將值存儲為object 因此,它不僅通過暴露的方法和屬性強制實施類型安全,而且它在所有方面都是真正的類型。

正如其他人所指出的那樣,抖動會為涉及新值類型的每個構造生成新代碼。 到目前為止尚未提及的一個有趣的觀點是,抖動將為參考類型構造生成一次代碼,並為每種引用類型重新使用該代碼。 List<object>的代碼與List<string>的代碼完全相同。

這可能聽起來很瘋狂,但請記住,泛型不是模板。 當發出泛型方法體IL的代碼時,C#編譯器已經完成了重載解析和其他相關的語義分析。

.NET泛型正在專門針對結構,因此在您的情況下不需要裝箱。 請注意,無論如何都不需要進行鑄造。

暫無
暫無

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

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