繁体   English   中英

单个类类型的C#数组或列表

[英]C# Array or List for a single Class type

我有一个包含一些基本类型的类。 (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#数组是仅保存对类实例的引用还是保存完整的数据结构?

这取决于。 如果将类型定义为引用类型( class ),则数组和列表都只包含对特定项的引用。 如果将其定义为值类型( struct ),则数组将保存实际元素。

  1. 并不是的。 内部列表只是普通数组,另外还有列表中的元素(不在数组中)。 你的功能会更差。
  2. 如果您知道元素的数量,并在列表初始化时设置它,那么您将不会保存任何内存。 使用List使用的内存很少,虽然列表大小是固定的,但它不依赖于元素的数量。 但是如果你没有指定确切的列表大小,那么每次添加新元素时,内部数组的大小将加倍,并且List元素的数量大于内部数组大小。
  3. 不。大多数时候它与使用普通数组相同。 除了内部数组重新调整大小时间(但它不会太长,并且在List修复时不会发生)。

在C ++中,数组和列表并不总是将完整的对象存储在其中。 它们可以包含仅包含引用。 .NET语言也是如此(即使对于托管C ++也是如此)。 值类型将按原样存储。 引用类型将被存储...作为对象的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM