object[] vs List<object> vs IEnumerable<object>
本文关键字:object lt vs gt IEnumerable List | 更新日期: 2023-09-27 17:52:46
我有大量相同类别obj
的对象,当前定义为obj[]
。
在大多数情况下,这些obj
只是default(obj)
,不是最好实现IEnumerable<obj>
而不是这些obj[]
列表吗?
这应该为我释放内存,对吗?目前这些对象(运行内存分析器)有200k项(不断增长)。
将列表更改为IEnumerables会帮助我吗?
List<T>
的实际实现是基于数组的,因此两者之间的内存使用差异可以忽略不计。
就IEnumerable<T>
而言:不,它不会为您节省任何内存。null
或default
元素在IEnumerable<T>
中是完全可以接受的,框架不做任何事情来过滤重复项。它不能,因为与IEnumerable<T>
结构相关的内存占用完全依赖于实现它的类,如果您只是将数组放入可枚举变量或字段,那么您不会改变任何实质性的东西。Enumerables也是不可变的,所以建议的切换可能会对你的数组实现造成破坏性的改变。
如果你不关心排序,你可以使用HashSet<T>
。这个实际上会过滤重复项,所以如果您的许多或大多数元素都是default(T)
,那么您只需要其中一个元素的内存。显然,这将消除所有重复的,而不仅仅是默认的,所以这个选择只有在没有其他重复的情况下才有用。
如果你需要可变语义——我怀疑如果你正在使用数组的话——那么你可以 (应该)切换到一个可变接口,比如IList<T>
,并编写你自己的实现——可能基于List<T>
——当你试图添加default(T)
时,它会忽略它。这样就可以保留非default
元素的顺序,而不必分配任何内存来保存default
元素。
IEnumerable
只是一个接口;它没有规定任何存储数据的方法。List
只包含一个数组,当您向其中添加更多项时该数组会增长,但是您可以调用TrimExcess()
方法来缩小数组。
正如Mark所说,IEnumerable只是一个接口。Object[]和List(以及。net框架中大多数其他泛型集合)实际上实现了IEnumerable接口。
更合适的问题应该是Object[]、List或LinkedList等哪个更好。
对象数组(即Object[])将具有最小的内存占用,因为列表可能是数组内存大小的两倍(取决于列表中有多少元素)。