DataTable
データを挿入/取得するときに、ボックス化/ボックス化解除を使用していることを知っています。たとえば、のみを含む非常に大量のデータがある場合、int
ある種のジェネリックを使用する方が高速ではありませんか?DataTable
MyDataTable<int>
2 に答える
文字列は参照型であるため、ボックス化のオーバーヘッドはありません。ボックス化されることはありません。ただし、DataTable には多くのオーバーヘッドがあります。これは、制約、変更追跡などと共に任意の列モデルを表現できるコストです。最適なパフォーマンスを得るには、POCO モデルに勝るものはありません。例えば:
public class Customer {
public int Id { get; set; }
public string Name { get; set; }
// ...
}
このタイプのモデルを操作するための ORM とマイクロ ORM はたくさんあります。
ただし、DataTable では、値は正しく型指定された配列に格納されることに注意してください。int は int[] に格納されます。これは、行ではなく列にデータを格納することによって行われます。ボクシングは、データを DataTable に出し入れするときにのみ発生します。
対処する必要がある主な問題は、DataTable
各列が任意の型である可能性がある任意の数の列を持つことができるということです。列ごとに異なる型を持ちながら、それを一般化することはできません。
ボックス化を回避する 1 つの方法は、 を使用するのではなく、DataTable
各行を表すオブジェクトを作成することです。オブジェクトに、適切なタイプの各列のプロパティがあることを確認してください。その後List
、これらのオブジェクト (またはその他のデータ構造) を操作できます。
たとえば、データに完全な値がある場合の別のオプションは、int
int の多次元配列 ( int[,] mydata = new int[10000,5];
) を作成することです。これにより、整数のボックス化も回避されます。