C#におけるArrayListとListオブジェクトと配列の違い

2334 ワード

配列には多くの利点があります.たとえば、配列はメモリに連続的に格納されているため、インデックスの速度が非常に速く、値の割り当てや要素の変更も簡単です.たとえば、次のようにします.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がエラーを報告し、コンパイルできません.これにより、前述したタイプの安全問題と箱詰め解体の性能問題が回避される.