ArrayList
最近、 fromは安全ではないと聞いてSystem.Collections
いますが、何が問題なのですか?安全とは、エラーが発生したり、望ましくない動作が発生したりする可能性があることです。
3 に答える
強く型付けされておらず、本質的にスレッドセーフでもありません*。のような強い型付けをサポートするより良い選択肢がありますSystem.Collections.Generic.List<T>
。
はコンパイル時のArrayList
型チェックをサポートしておらず、ボクシング/アンボクシングのオーバーヘッドが発生する可能性があり、一般的に操作が面倒です。これはジェネリックスの前に導入されたため、前述の問題は解消されています。
*正確さのために、ArrayListはSynchronized
、あるレベルのスレッドセーフを提供するプロパティを公開します(記事の最後にある注を参照)。
強く型付けされていないため、安全ではありません。これは、コンパイル時に、内部に格納できるオブジェクトのタイプがわからないことを意味します。また、実際のタイプにキャストする必要があります。つまり、実行時にのみエラーが発生します。代わりに、一般的で強く型付けされた同等のものを使用する必要がありますList<T>
。
ArrayListから取得した結果を実際の型にキャストする必要がある次の例を見てください。
ArrayList list = new ArrayList();
list.Add(123);
int element = (int)list[0];
間違ったタイプにキャストすると、プログラムが実行時にのみクラッシュするため、状況がひどく間違ってしまう可能性があります。
一方、List<T>
このキャストは必要なく、コンパイル時の安全性が得られます。
List<int> list = new List<int>();
list.Add(123);
int element = list[0];
安全性とは(型安全性とは対照的に)スレッドセーフを意味する場合、これはまったく異なることです。ArrayList
とは両方ともList<T>
スレッドセーフなクラスではありません。これは、たとえば、別のスレッドがコレクションを変更しているときに、あるスレッドからコレクションから読み取ろうとすると、例外または破損したデータが発生する可能性があることを意味します。.NET 4.0では、スレッドセーフコレクションが導入されました。
実行時に以下が失敗するため、安全ではありません。
myArrayList.Add(new Banana());
Airplane obj = (Airplane)myArrayList[0];
object
ArrayListはsのみを受け取り、返すため、コンパイラはバナナを飛行機として使用しようとしていることを検出できません。.NETのすべてがobject
。です。
ArrayList
System.Collections.Generics.List(T)
.NET2.0以降は基本的にに置き換えられています。これはより強く型付けされた置換であり、この種の間違いを許しません。