结构数组或一个包含每个属性数组的结构

时间:2010-02-18 16:11:18

标签: c# api api-design

在设计API时,我可能希望将详细信息(例如正在运行的进程)保存到我自己的自定义结构中。但是,如果我要为多个进程执行此操作,这意味着我需要多个结构,我是否应该有一个结构数组或一个结构,其中包含每个属性的数组(例如startTime,processName和其他进程属性我是感兴趣)。

哪种方式更适合性能,更适合api / class库?

由于

4 个答案:

答案 0 :(得分:2)

恕我直言,你应该做一系列的结构,尽管你为实现所有结构的性能打击了。存储在一个结构中的一个状态的组织意义远远超过性能的损失,并且使用一个结构与一堆数组并且简单地为每个进程分配多个数组中的索引是非常混乱的并且可能是调试的巨大痛苦

答案 1 :(得分:1)

您可以考虑使用class而不是struct,我会使用类列表。

答案 2 :(得分:0)

Eric Lippert有一些反对在API中使用数组的论据。对我来说更有吸引力的是为什么你想要保持集合大小固定,但允许消费者修改内容。您可以看到更多here

最终,您可能希望使用数组在内部存储它们,但我会避免通过API公开它。如果人们需要枚举,请使用IEnumerable< T>代替。

答案 3 :(得分:0)

从数据存储的角度来看,如果一个人经常访问项目的所有部分,而不是一个人从一组连续项目中访问某个特定部分,那么使用结构数组的缓存行为会更好。

一个更有趣的问题是如何公开数据。如果将结构体公开为索引器,那么任何想要更改结构体字段的人都必须读出结构体,更改临时副本中的字段并将其写回。您可以公开读/写单个属性的方法,但“foo.setBar(100,23)”似乎不如“foo(100).Bar = 23”自然。也许允许后一种语法,我建议让索引器返回一个带有两个私有字段的结构,“root”和“index”,以及结构的每个字段的属性,以便例如索引器的Bar属性的setter将执行root.setBar(index,value)。索引器还应该有一个“asWhateverStructType”属性来获取/设置整个结构。