2009-12-03 6 views
1

SQL 쿼리에서 행을 나타내는 클래스를 작성하고 있습니다. 클래스의 indexer 속성을 통해 필드 데이터에 액세스하려고합니다. 이것은 데이터를 객체의 내부 목록에로드하는 것만 큼 간단합니다. 나는 이미 이것을 시도하고 프리미엄을위한 복싱에 만족하지 않습니다. 권투는 20 % 메모리 요구 사항을 증가시킵니다. 클래스의 프리미티브로 프리미티브를 저장하려고합니다. DataTable 클래스는 IDataReader에서 반환 된 스키마의 각 열에 대한 배열을 만들어 프리미티브를 저장합니다. 이런 식으로 클래스를 구현했지만 데이터가 행에 의해 내부적으로 참조되는 열 대신에 행 개체와 함께 저장되는 것을 선호합니다.임의의 sql 행을 읽을 때 박스 해제 메모리 오버 헤드를 방지하는 방법

달성에 대한 아이디어가 있습니까?

답변

2

행을 나타내는 구조 유형을 생성 할 수 있습니다. 그것은 동적으로 할 수 있고 어떤 복싱도 없을 것입니다 그래서 그것을 할 수 있습니다. 그래도 그럴 가치가 있는지 모르겠다.

+0

클래스가 아닌 구조 유형이어야하는 이유는 무엇입니까? – Amnon

+0

+1 멋진 아이디어입니다.하지만 당신이 말한대로, 나는 아직 거기 갈 준비가되어 있다는 것을 모릅니다. 먼저 일반 접근법을 시도해보고 잘리지 않으면 동적으로 내부 구조를 만들려고합니다. 감사합니다 – Steve

+0

@ 리드 - 나는 일반 클래스 자체에서 권투를 잡으려고하지 않았다, 당신은 맞습니다. 이것은 메모리를 절약하지 못할 것입니다. – Steve

2

오버 헤드가 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 
+0

어떻게 한 줄에 여러 유형을 처리합니까? –

+0

당신은 인덱서에 대해 이야기했습니다. 인덱서 당 하나의 유형이 있거나 그렇지 않습니다. 인덱서 당 여러 유형이 있다면 복싱 사용을 피할 수 없습니다. 이는 유형 안전을 사용하지 않는 것에 대해 지불하는 가격입니다. 일반적으로 데이터 테이블과 다소 1 : 1로 일치하는 클래스를 만듭니다. 유형은 DB의 유형과 일치합니다. 제네릭을 사용하면 이러한 유형의 작업을 사용하는 중 지루한 부분을 제거 할 수 있으므로 동일한 get-from-db 코드와 store-to-db 코드를 반복해서 작성할 필요가 없습니다. 이것은 전형적인 DAO 시나리오입니다. – Abel

+0

죄송합니다, Reed에 적용된 "you", 나는 코멘트에 대한 답변을 쓸 때 Steve라고 생각했습니다. – Abel