C#におけるArrayListとListオブジェクトと配列の違い
2334 ワード
配列には多くの利点があります.たとえば、配列はメモリに連続的に格納されているため、インデックスの速度が非常に速く、値の割り当てや要素の変更も簡単です.たとえば、次のようにします.
しかし、配列にもいくつかの不足点がある.たとえば配列の2つのデータ間にデータを挿入するのも面倒です.また、配列を宣言するときは、配列の長さ、配列の長さが長すぎると、メモリの浪費、配列と長さが短すぎると、データがオーバーフローするエラーを同時に指定する必要があります.これにより,配列を宣言する際に配列の長さが不明になると,厄介になる.
配列のこれらの欠点に対して、C#では、これらの欠点を克服するためにArrayListオブジェクトが最初に提供される.ArrayListは.Net Frameworkは、ネーミングスペースSystemであるデータの格納と取得のための専用クラスを提供する.Collectionsの下の部分.そのサイズは、格納されているデータに従って動的に拡張され、縮小されます.したがって、ArrayListオブジェクトを宣言するときに長さを指定する必要はありません.ArrayListはIListインタフェースを継承するので、データの追加、挿入、削除を容易に行うことができる.たとえば
やはり上記の例から見ると、listでは文字列「abc」だけでなく、数値123も挿入されている.このようにArrayListに異なるタイプのデータを挿入することは可能である.ArrayListは、挿入されたすべてのデータをobjectタイプとして扱うからです.このように、ArrayListのデータを用いて問題を処理する場合、タイプが一致しないエラー、すなわちArrayListはタイプが安全ではないと報告される可能性が高い.データを挿入するときに注意深く、同じタイプのデータが挿入されていることを保証しますが、使用するときは、対応する元のタイプに変換して処理する必要があります.これにより、梱包と解体の操作が存在し、大きな性能損失をもたらす.
汎用リストは、ArrayListが安全でないタイプと箱詰めで箱を外すという欠点があるため、C#2.0以降に汎用的な概念が現れた.一方,ListクラスはArrayListクラスの汎用等価クラスである.リストクラスもIListインタフェースを継承しているため、そのほとんどの使用法はArrayListと似ている.最も重要な違いは,リスト集合を宣言する際に,リスト集合内のデータのオブジェクトタイプを同時に宣言する必要があることである.
上記の例では、リストセットにstring文字「hello world」を挿入すると、IDEがエラーを報告し、コンパイルできません.これにより、前述したタイプの安全問題と箱詰め解体の性能問題が回避される.
string
[] s=
new
string
[3];
//
s[0]=
"a"
;
s[1]=
"b"
;
s[2]=
"c"
;
//
s[1]=
"b1
しかし、配列にもいくつかの不足点がある.たとえば配列の2つのデータ間にデータを挿入するのも面倒です.また、配列を宣言するときは、配列の長さ、配列の長さが長すぎると、メモリの浪費、配列と長さが短すぎると、データがオーバーフローするエラーを同時に指定する必要があります.これにより,配列を宣言する際に配列の長さが不明になると,厄介になる.
配列のこれらの欠点に対して、C#では、これらの欠点を克服するためにArrayListオブジェクトが最初に提供される.ArrayListは.Net Frameworkは、ネーミングスペースSystemであるデータの格納と取得のための専用クラスを提供する.Collectionsの下の部分.そのサイズは、格納されているデータに従って動的に拡張され、縮小されます.したがって、ArrayListオブジェクトを宣言するときに長さを指定する必要はありません.ArrayListはIListインタフェースを継承するので、データの追加、挿入、削除を容易に行うことができる.たとえば
ArrayList list =
new
ArrayList();
//
list.Add(
"abc"
);
list.Add(123);
//
list[2] = 345;
//
list.RemoveAt(0);
//
list.Insert(0,
"hello world"
);
やはり上記の例から見ると、listでは文字列「abc」だけでなく、数値123も挿入されている.このようにArrayListに異なるタイプのデータを挿入することは可能である.ArrayListは、挿入されたすべてのデータをobjectタイプとして扱うからです.このように、ArrayListのデータを用いて問題を処理する場合、タイプが一致しないエラー、すなわちArrayListはタイプが安全ではないと報告される可能性が高い.データを挿入するときに注意深く、同じタイプのデータが挿入されていることを保証しますが、使用するときは、対応する元のタイプに変換して処理する必要があります.これにより、梱包と解体の操作が存在し、大きな性能損失をもたらす.
汎用リストは、ArrayListが安全でないタイプと箱詰めで箱を外すという欠点があるため、C#2.0以降に汎用的な概念が現れた.一方,ListクラスはArrayListクラスの汎用等価クラスである.リストクラスもIListインタフェースを継承しているため、そのほとんどの使用法はArrayListと似ている.最も重要な違いは,リスト集合を宣言する際に,リスト集合内のデータのオブジェクトタイプを同時に宣言する必要があることである.
List<
int
> list =
new
List<
int
>();
//
list.Add(123);
//
list[0] = 345;
//
list.RemoveAt(0);
上記の例では、リストセットにstring文字「hello world」を挿入すると、IDEがエラーを報告し、コンパイルできません.これにより、前述したタイプの安全問題と箱詰め解体の性能問題が回避される.