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

标签 c# arrays list

我有一个包含一些基本类型的类。 (3 倍 float ,2 倍整数)。

现在我需要一个可以容纳数百万个此类实例的集合。我不需要派生类型。所有元素都完全来自这个单一类。 此外,元素的数量是固定的。在极少数情况下,我计划复制整个列表/数组并修改副本。最初的列表/数组应该是不可变的,因此我不需要与其他线程同步。

现在的问题是:

  • 我受益于数组而不是列表吗?
  • 我可以使用数组来节省内存吗?
  • 速度怎么样?

我读到 C# 中的列表在内部也是作为数组实现的。

如果是 C++,我知道数组会包含完整的对象。但我不确定 C# 是如何处理这个问题的。 C# 数组是仅保存对类实例的引用还是保存完整的数据结构?

最佳答案

The originally list/array shall be immutable, thus I don't need to synchronize with other threads.

您是否考虑过使用不可变集合而不是 T[]List<T> ? <强> ImmutableArray<T> 最有意义。您可以使用 ImmutableArray<T>.Builder 以高效的方式创建集合。

  • Do I benefit from an Array instead of a List?

如果您不需要更改元素的数量,您应该使用 Array。这会让所有查看您的代码的人清楚地知道您没有更改元素的数量。

  • Do I save memory using an Array?

这取决于您如何创建 List<T> .在内部,当您向 List<T> 添加元素时一个接一个底层数组的大小是使用 2* 乘数更改的:当没有足够的空间容纳新元素时,当前底层数组将被一个两倍大小的新元素替换。所以是的,您可以直接使用 Array 来节省内存,因为您不会分配任何不必要的内存。但是,您可以使用 List<T> 实现相同的效果,通过使用具有列表容量的构造函数或通过调用 TrimExcess 创建它将所有元素添加到列表后的方法。

  • What about speed?

使用数组,您将保存生成 List<T> 的逻辑方法、属性和索引器属性调用转换为底层数组调用。但是你不应该关心它,它不会被注意到。

If it would be C++, I know that the array would hold the complete object. But I'm not sure how C# handles this. Will a C# array only hold references to the class instances or will it hold the complete datastructure?

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

关于单个类类型的 C# 数组或列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26501498/

相关文章:

c# - 从 SQL Server Compact 反序列化会引发 "There is an unclosed literal string."错误

c# - 何时在 ASP.NET Core 5 中处理 DbContext 实例

ruby - 数组的未定义方法 `each '

javascript - 如何创建一维和二维数组以及如何在 Protractor 中初始化具有特定数组大小的数组?

python - 列表元素的代数运算

java - while循环逻辑缺陷

c# - 为什么这些数据绑定(bind)不更新?

c# - 客户端自定义数据注释验证

java - 如何使用 for 循环解压缩 Shorts[][] 数组?

Java无法识别main方法中的数组