我有一个包含一些基本类型的类.(3x float,2x int).
现在我需要一个可以容纳这个类的数百万个实例的集合.我不需要派生类型.所有元素都完全来自这个单独的类.更多元素的数量是固定的.在极少数情况下,我计划复制整个列表/数组并修改副本.最初的列表/数组应该是不可变的,因此我不需要与其他线程同步.
现在的问题是:
我读到C#中的List也在内部实现为Array.
如果它是C++,我知道数组将保存完整的对象.但我不确定C#如何处理这个问题.C#数组是仅保存对类实例的引用还是保存完整的数据结构?
最初的列表/数组应该是不可变的,因此我不需要与其他线程同步.
你有没有考虑一个不可改变的集合,而不是T[]
或List<T>
?ImmutableArray<T>
最有意义的.您可以使用ImmutableArray<T>.Builder
以有效的方式创建集合.
- 我是从数组而不是列表中受益吗?
如果您不需要更改元素的数量,则应使用Array.它会让每个查看代码的人都清楚地知道你没有改变元素的数量.
- 我是否使用数组保存内存?
这取决于你是如何创造的List<T>
.在内部,当你List<T>
逐个添加元素时,底层数组的大小是使用2*乘数的变化:当没有足够的空间用于新元素时,当前的底层数组被一个大小为两倍的新数组所取代.所以,是的,您可以直接使用Array保存内存,因为您不会分配任何不必要的内存.但是,您可以List<T>
通过使用获取列表容量的构造函数创建它或通过TrimExcess
在将所有元素添加到列表后调用方法来实现相同的使用.
- 速度怎么样?
使用数组,您将保存逻辑,使List<T>
方法,属性和索引器属性调用转换为基础数组调用.但你不应该关心它,它将是不明显的.
如果它是C++,我知道数组将保存完整的对象.但我不确定C#如何处理这个问题.C#数组是仅保存对类实例的引用还是保存完整的数据结构?
这取决于.如果将类型定义为引用类型(a class
),则array和list都只包含对特定项的引用.如果将其定义为值类型(a struct
),则数组将保存实际元素.