2010-02-18 125 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」屬性來獲取/設置整個結構體。

相關問題