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