2009-12-03 6 views
1

Я пишу класс для представления строки из SQL-запроса. Я хочу, чтобы данные полей были доступны через свойство indexer этого класса. Это достаточно просто, если я загружаю данные во внутренний список объектов. Я уже пробовал это и не доволен боксом для примитивов. Бокс увеличивает потребность в памяти на 20%. Я хотел бы сохранить примитивы в качестве примитивов в классе. Класс DataTable хранит примитивы, создавая массивы для каждого столбца в схеме, возвращенной из IDataReader. Я реализовал класс таким образом, но я предпочел бы, чтобы данные хранились с объектом строки, а не в столбце, на который ссылается внутренне строка.Как предотвратить unboxing - накладные расходы на память при чтении произвольных строк sql

Любые идеи по достижению этого?

ответ

2

Вы можете сгенерировать тип структуры для представления строки. Это можно сделать динамически, и это возможно сделать, чтобы не было никакого бокса. Я не уверен, что это стоит усилий, но

+0

Почему это должен быть тип структуры, а не класс? – Amnon

+0

+1 Это классная идея, но, как вы говорите, я не знаю, что я готов туда пойти еще. Сначала я попробую общий подход, и если он не сократит его, я попытаюсь создать динамическую динамическую структуру. Спасибо – Steve

+0

@Reed - я не поймал бокс из самого родового класса, вы правы. Это не спасет память. – Steve

2

Только 20% накладных расходов? Ты счастливчик! Я просто очистил код, где он добавил снижение производительности в четыре раза (не считая влияния дополнительной памяти)! Во всяком случае, типичным способом предотвращения использования 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 
+0

Как это обрабатывать несколько типов в одной строке? –

+0

Вы говорили об индексаторах. У вас либо есть один тип для индексатора, либо нет. Если у вас есть несколько типов для индексатора, вы не можете избежать использования бокса, это цена, которую вы платите за небезопасность типа. Обычно вы создаете класс, соответствующий вашим таблицам данных, несколько 1: 1. Типы затем соответствуют типам в БД. Используя generics, вы можете удалить некоторые из более утомительных частей использования действий с этими типами, поэтому вам не нужно снова и снова записывать одни и те же коды get-from-db и store-to-db. Это типичный сценарий DAO. – Abel

+0

Извините, «вы» обратились к Риду, я подумал, что это Стив, когда я написал ответ на комментарий ;-) – Abel