在设计 API 时,我可能希望将详细信息(例如正在运行的进程)保存到我自己的自定义结构中。但是,如果我要为超过 1 个进程执行此操作,这意味着我需要多个结构,我应该有一个结构数组还是一个结构,其中每个属性都有一个数组(例如 startTime、processName 和我的其他进程属性)有兴趣)。
哪种方式对性能更好,对 api/类库更好?
谢谢
在设计 API 时,我可能希望将详细信息(例如正在运行的进程)保存到我自己的自定义结构中。但是,如果我要为超过 1 个进程执行此操作,这意味着我需要多个结构,我应该有一个结构数组还是一个结构,其中每个属性都有一个数组(例如 startTime、processName 和我的其他进程属性)有兴趣)。
哪种方式对性能更好,对 api/类库更好?
谢谢
恕我直言,尽管实例化所有结构会对性能造成影响,但您应该执行一系列结构。将一个状态存储在一个结构中的组织意义远远超过了性能损失,并且使用一个带有一堆数组的结构并简单地为每个进程分配多个数组中的索引非常混乱,调试起来可能会很痛苦.
您可能会考虑使用 aclass
而不是 a struct
,我会使用类列表。
Eric Lippert 有一些反对在 API 中使用数组的论点。对我来说更引人注目的原因之一是为什么您要保持集合大小固定,但允许消费者修改内容。你可以在这里看到更多。
最终,您可能希望使用数组在内部存储它们,但我会避免通过 API 公开它。如果人们需要枚举,请改用 IEnumerable<T>。
从数据存储的角度来看,如果一个人经常访问一个项目的所有部分,而不是访问一组连续项目中的某个特定部分,那么使用结构数组的缓存行为会更好。
一个更有趣的问题是如何公开数据。如果将结构公开为索引器,则任何想要更改结构字段的人都必须读出结构,更改其临时副本中的字段,然后将其写回。您可以公开读取/写入单个属性的方法,但“foo.setBar(100, 23)”似乎不如“foo(100).Bar=23”自然。太允许后一种语法,我建议也许让索引器返回一个具有两个私有字段“root”和“index”的结构,以及该结构的每个字段的属性,以便例如索引器的 Bar 属性的设置器将执行 root.setBar(index, value)。索引器还应该有一个“asWhateverStructType”属性来获取/设置整个结构。