gpt4 book ai didi

c# - 使用泛型装箱和拆箱

转载 作者:IT王子 更新时间:2023-10-29 03:44:21 34 4
gpt4 key购买 nike

创建整数集合(例如)的 .NET 1.0 方法是:

ArrayList list = new ArrayList();
list.Add(i); /* boxing */
int j = (int)list[0]; /* unboxing */

使用它的代价是由于装箱和拆箱而缺乏类型安全和性能。

.NET 2.0 的方法是使用泛型:

List<int> list = new List<int>();
list.Add(i);
int j = list[0];

装箱的代价(据我所知)是需要在堆上创建一个对象,将堆栈分配的整数复制到新对象,反之亦然进行拆箱。

泛型的使用如何克服这个问题?堆栈分配的整数是否保留在堆栈上并从堆中指向(我想情况并非如此,因为当它超出范围时会发生什么)?似乎仍然需要将它复制到堆栈之外的其他地方。

到底是怎么回事?

最佳答案

当谈到集合时,泛型可以通过使用实际的 T[] 来避免装箱/拆箱。内部数组。 List<T>例如使用 T[]数组来存储其内容。

当然,数组 是一种引用类型,因此(在当前版本的 CLR 中,yada yada)存储在堆中。但因为它是 T[]而不是 object[] ,数组的元素可以“直接”存储:也就是说,它们仍然在堆上,但它们在堆上在数组中,而不是被装箱并让数组包含对盒子。

所以对于 List<int> ,例如,数组中的内容“看起来”像这样:

[ 1 2 3 ]

将此与 ArrayList 进行比较,它使用 object[]因此会“看起来”像这样:

[ *a *b *c ]

...哪里*a等是对对象(盒装整数)的引用:

*a -> 1*b -> 2*c -> 3

请原谅那些粗糙的插图;希望你明白我的意思。

关于c# - 使用泛型装箱和拆箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4403055/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com