[英]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.