web-dev-qa-db-ja.com

ArrayListとList <object>

私はジョンからのこの返信を見ました 不明なタイプでジェネリックオブジェクトを初期化

単一のコレクションに複数の無関係なタイプの値を含める場合は、List<object>を使用する必要があります

ArrayListList<>を比較するのではなく、ArrayListList<object>を比較します。どちらもobject型の要素を公開するためです。この場合、どちらを使用するメリットは何ですか?

編集:どちらのクラスもアイテムとしてobjectを公開しているため、ここでは型の安全性は問題になりません。 objectから目的の型にキャストする必要があります。タイプセーフティ以外に興味があります。

編集:答えを提供してくれたMarc GravellとSeanに感謝します。申し訳ありませんが、回答として1つしか選択できないため、両方に賛成票を投じます。

46
faulty

Cast<object>()/List<object>を挿入しない限り、OfType<object>ではLINQ拡張メソッドを直接使用できますが、ArrayListでは使用できません(おかげでIEnumerable<object> vs IEnumerable)。タイプセーフティなどが必要ない場合でも、これはかなりの価値があります。

速度はほぼ同じになります。構造体はまだボックス化されていますなど-それで、それらを区別するために他に多くはありません。私がArrayListを「おっと、だれかが再びレガシーコードを書いている...」と見る傾向があることを除いて、;-p

73
Marc Gravell

List<object>を使用する大きな利点の1つは、最近のほとんどのコードが汎用のクラス/インターフェースを使用するように記述されていることです。最近、ほとんどの人がIListではなくIList<object>をとるメソッドを書くと思います。 ArrayListIList<object>を実装していないため、これらのシナリオでは配列リストを使用できません。

私は、非ジェネリッククラス/インターフェースをレガシーコードと考え、可能な限りそれらを回避する傾向があります。

41
Sean

この場合、ArrayListList<Object>その後、速度の違いに気付くことはありません。これらのそれぞれで使用できる実際のメソッドにはいくつかの違いがある可能性があります(特に.NET 3.5とカウント拡張メソッド)。

はい、タイプセーフであることに加えて、ジェネリックコレクションの方が実際には高速です。

MSDNから( http://msdn.Microsoft.com/en-us/library/system.collections.generic.aspx

System.Collections.Generic名前空間には、ジェネリックコレクションを定義するインターフェイスとクラスが含まれます。これにより、ユーザーは、型の安全性とパフォーマンスが向上する厳密に型指定されたコレクションを作成できます。非ジェネリックの強く型付けされたコレクション。

5
Tamas Czinege

ベンチマークを行うと、最も効果的なものがわかります。その差は非常に小さいと私は思います。

1
tuinstoel