web-dev-qa-db-ja.com

C#のArrayList vs List <>

C#のArrayListList<>の違いは何ですか?

List<>が型を持つ一方でArrayListが型を持たないということだけですか?

364
scatman

はい、ほとんどです。 List<T>はジェネリッククラスです。 objectとの間でキャストしたりキャストしたりせずに特定の型の値を格納することをサポートします(TArrayListの場合の値型である場合、ボックス化/ボックス化解除のオーバーヘッドが発生します)。 ArrayListは単にobject参照を格納するだけです。総称コレクションとして、List<T>は総称IEnumerable<T>インターフェースを実装し、LINQで簡単に使用できます(CastまたはOfType呼び出しを必要とせずに)。

ArrayListはC#が総称を持たなかった時代に属します。 List<T>のために廃止予定です。 .NET> = 2.0をターゲットとする新しいコードでは、それを使用する古いAPIとのインタフェースが必要でない限り、ArrayListを使用しないでください。

481
Mehrdad Afshari

List<T>を使用すると、キャストエラーを防ぐことができます。 runtime キャストエラーを回避するのは非常に便利です。

例:

ここで(ArrayListを使用して)このコードをコンパイルできますが、後で実行エラーが発生します。

ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
 total += num; //-->Runtime Error
}

Listを使用すれば、これらのエラーを回避できます。

List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
 total += num;
}

参照先: _ msdn _

93
termas

上記の点に追加します。 64ビットオペレーティングシステムでArrayListを使用すると、32ビットオペレーティングシステムで使用するよりも2倍のメモリが消費されます。一方、総称リストList<T>ArrayListよりもはるかに少ないメモリを使用します。

たとえば、32ビットで19MBのArrayListを使用すると、64ビットでは39MBかかります。しかし、32ビットで8MBの汎用リストList<int>があるとすれば、64ビットでは8.1MBしかかからず、これはArrayListと比較したときに481%の大きな違いです。

出典: ArrayListとプリミティブ型および64ビットの総称リスト

23
Anoop

追加すべきもう1つの違いは、スレッド同期に関する点です。

ArrayListはSynchronizedプロパティを通してスレッドセーフを提供します。これはコレクションの周りのスレッドセーフラッパーを返します。ラッパーは、追加または削除操作のたびにコレクション全体をロックすることによって機能します。したがって、コレクションにアクセスしようとしている各スレッドは、順番が1つロックされるのを待つ必要があります。これはスケーラブルではなく、大規模コレクションではパフォーマンスが大幅に低下する可能性があります。

List<T>はスレッド同期を提供しません。項目が複数のスレッドで同時に追加または削除された場合、ユーザーコードはすべての同期を提供する必要があります。

より詳しい情報はこちら .NET Frameworkにおけるスレッド同期

18
NullReference

簡単な答えは

ArrayListは非ジェネリックです

  • これはオブジェクト型なので、任意のデータ型を格納できます。
  • ArrayListには、文字列、int、employee、objectなどの任意の値(値型または参照型)を格納できます。 (注)
  • ボクシングとボクシング解除が行われます。
  • 安全ではありません。
  • 年上です。

リストは一般的です

  • これはType of Typeなので、実行時にTを指定できます。
  • 宣言に基づいて、Type T(string、int、またはemployeeまたはobject)の値のみを格納できます。 (注)
  • ボクシングとアンボクシングは起こりません。
  • 金庫にタイプしてください。
  • もっと新しいです。

例:

ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();

arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());


list.Add(1);
list.Add("String");                 // Compile-time Error
list.Add(new object());             // Compile-time Error

マイクロソフトの公式ドキュメントをお読みください https://blogs.msdn.Microsoft.com/ja-jp/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system -collections-objectmodel/

enter image description here

:違いを理解する前にGenericsを知っておく必要があります。 https://docs.Microsoft.com/ja-jp/dotnet/csharp/programming-guide/generics/

6
Aravin

ArrayListは型保証されていませんが、List<T>は型保証されています。シンプル:)。

3
Hassan Rahman

ArrayListはさまざまな型のデータのコレクションですが、List<>はそれ自体が依存する類似した型のコレクションです。

2
Law Kant Dayal

ArrayListList<T>の違いは次のとおりです。

  1. List<T>、ここでTはvalue-typeです。ArrayListより速いです。これはList<T>がボックス化/ボックス化解除を回避するためです(Tは値型)。
  2. 多くの情報源が言っています - 通常ArrayListは後方互換性のためだけに使用されます。 (それは本当の違いではありませんが、私はそれが重要な注意であると思います)。
  3. 非総称ArrayListList<T>の方が反射が簡単です
  4. ArrayListIsSynchronizedプロパティを持ちます。そのため、同期化されたArrayListを作成して使用するのは簡単です。 List<T>IsSynchronizedプロパティが見つかりませんでした。また、この種の同期は比較的非効率的です( msdn )。

    var arraylist = new ArrayList();
    var arrayListSyncronized = ArrayList.Synchronized(arraylist
    Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
    Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
    
    var list = new List<object>();
    var listSyncronized = ArrayList.Synchronized(list);
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    
  5. ArrayListには、同期に使用できるArrayList.SyncRootプロパティがあります( msdn )。 List<T>SyncRootプロパティを持っていません。そのため、List<T>を使用する場合は、次の構成で何らかのオブジェクトを使用する必要があります。

    ArrayList myCollection = new ArrayList();
    lock(myCollection.SyncRoot) //  ofcourse you can use another object for this goal
    {
        foreach (object item in myCollection)
        {
            // ...
        }
    }
    
1
burzhuy