加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:45:49 所属栏目:百科 来源:网络整理
导读:我有一个包含一些基本类型的类. (3x float,2x int). 现在我需要一个可以容纳这个类的数百万个实例的集合.我不需要派生类型.所有元素都完全来自这个单独的类. 更多元素的数量是固定的.在极少数情况下,我计划复制整个列表/数组并修改副本.最初的列表/数组应该
我有一个包含一些基本类型的类. (3x float,2x int).

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

现在的问题是:

>我是从数组而不是列表中受益吗?
>我是否使用数组保存内存?
>速度怎么样?

我读到C#中的List也在内部实现为Array.

如果它是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?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读