2010-02-18 102 views
1

当设计一个API时,我可能想要将细节(例如运行的进程)保存到我自己的自定义结构中。然而,如果我打算为超过1个进程执行此操作,这意味着我需要几个结构体,我应该为每个结构体拥有一个结构数组或一个结构体(例如startTime,processName和其他进程属性)有兴趣)。数组的结构或一个结构与其每个属性

哪种方式更好的性能和更好的api /类库?

感谢

+3

请用户,没有比得到我的山羊更多的匿名投票下来。这个问题对我来说似乎很清楚简洁,值得直接回答。你为什么要投票呢? – 2010-02-18 16:21:09

回答

2

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

+0

对组织点有意义。一个结构/一个进程。任何其他方法难以调试的例子? – dotnetdev 2010-02-18 22:17:04

+0

我确定我不需要向您显示代码,因为它很简单。以我想到的两种方式进行调试将更加困难。如果您将代码单独保留一段时间并回过头来看,可能会让人感到困惑 - 尤其是如果您需要向前或向后浏览并查看大量StartTime [x-1]或ProcessID [x + 2]时。那些和二进制文件在很长一段时间后可能看起来是任意的,所以只要在一个类或结构体中拥有每一个进程就可以让生活更轻松。这也是非常危险的,可以得到ArrayOutOfBounds异常。 – 2010-02-19 14:41:02

+0

还有使数组/列表/字典等的性能更大。如果您的数组最初大小为5,并且您添加了第6个进程,那么您只需要为每个要保留的属性调整一个数组的大小,而不是一个。我推荐使用foreach的简易列表(listOfProcesses中的customStruct s){},这样可以避免int len = listOfTimes。长度(); for(int i = 0; i ; processNameList [i] ; ...} – 2010-02-19 14:45:57

1

你可能会考虑使用class,而不是一个struct,我会用类的列表。

0

Eric Lippert有一些反对在API中使用数组的参数。对我来说更引人注目的是为什么你想要保持收藏大小固定,但允许消费者修改内容。你可以看到更多here

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

0

从数据存储的角度来看,如果一个人经常访问一个项目的所有部分的频率比从一组连续项目中访问某个特定部分的频率要高,那么缓存行为对于一系列结构。

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

相关问题