我在寫一個類來表示SQL查詢中的一行。我想要通過類的索引器屬性來訪問字段數據。如果我將數據加載到對象的內部列表中,這很簡單。我已經嘗試過了,並且對原始的拳擊感到不滿意。拳擊增加了20%的內存需求。我想將原語作爲原語存儲在類中。 DataTable類通過爲從IDataReader返回的模式中的每列創建數組來存儲基元。我以這種方式實現了一個類,但我寧願將數據與行對象而不是存儲在行內部引用的列中。如何防止在閱讀任意sql行時取消裝箱 - 內存開銷
有關完成此任何想法?
我在寫一個類來表示SQL查詢中的一行。我想要通過類的索引器屬性來訪問字段數據。如果我將數據加載到對象的內部列表中,這很簡單。我已經嘗試過了,並且對原始的拳擊感到不滿意。拳擊增加了20%的內存需求。我想將原語作爲原語存儲在類中。 DataTable類通過爲從IDataReader返回的模式中的每列創建數組來存儲基元。我以這種方式實現了一個類,但我寧願將數據與行對象而不是存儲在行內部引用的列中。如何防止在閱讀任意sql行時取消裝箱 - 內存開銷
有關完成此任何想法?
您可以生成結構類型來表示一行。它可以動態完成,可以做到這一點,所以不會有任何拳擊。我不知道這是值得的努力,雖然
只有20%的開銷?你很幸運!我剛剛清理了一些代碼,它增加了40倍的性能下降(不計算額外內存的影響)!無論如何,防止使用object
的典型方法是開始使用泛型。這裏有一個簡化的例子:
class RowRepresenter<T>
{
//....
public T this[int index] {get; set;} // implementation left out
}
// initialize, suppose the properties (indexers) should be ints:
RowRepresenter<int> myInstance = new RowRepresenter<int>();
myInstance.LoadData();
// get data (i.e., your indexer)
int somefield = myInstance[2]; // no overhead, no casting required
這是如何處理多個類型的單行? – 2009-12-03 21:03:52
你談到了索引器。您每個索引器都有一種類型,或者您沒有。如果每個索引器有多種類型,則無法避免使用裝箱,這是您爲不使用類型安全而付出的代價。通常,您創建一個與您的數據表匹配1:1的類。這些類型然後匹配數據庫中的類型。使用泛型,您可以刪除使用這些類型的操作中更乏味的部分,因此您不必一次又一次編寫相同的get-from-db和store-to-db代碼。這是一個典型的DAO場景。 – Abel 2009-12-03 21:07:45
對不起,「你」應用於裏德,我認爲這是史蒂夫,當我寫評論的答案;-) – Abel 2009-12-03 21:11:13
爲什麼它應該是結構類型而不是類? – Amnon 2009-12-03 21:07:56
+1這是一個很酷的想法,但正如你所說,我不知道我已經準備好去那裏了。我會先嚐試通用方法,如果它不削減它,我會嘗試動態地創建一個內部結構。謝謝 – Steve 2009-12-03 21:11:01
@Reed - 我沒有趕上通用類本身的拳擊,你是對的。這不會節省內存。 – Steve 2009-12-03 21:19:25