c#でarray []よりもArrayListを使用する場合
質問
「通常」の代わりにArrayList
をよく使用しますarray[]
。
<=>を使用するときに不正行為をしている(または怠けている)ように感じますが、配列に対して<=>を使用しても大丈夫ですか?
解決
配列は強く型付けされており、パラメータとして機能します。コレクションの長さがわかっていて固定されている場合は、配列を使用する必要があります。
ArrayListsは強く型付けされていません。すべての挿入または再試行では、元の型に戻すためにキャストが必要になります。特定の型のリストを取得するメソッドが必要な場合は、任意の型を含むArrayListを渡すことができるため、ArrayListsは不十分です。 ArrayListsは内部で動的に拡張する配列を使用するため、内部配列が容量に達したときに内部配列のサイズを拡張するヒットもあります。
本当に使用したいのは、List<T>
のような一般的なリストです。これには、ArrayおよびArrayListsのすべての利点があります。強く型付けされ、可変長のアイテムをサポートします。
他のヒント
ボブとフレデリックの応答に加えて、配列には共分散がありますが、一般的なリストにはないことを指摘したいと思います。たとえば、MyChildClass[]
型の配列はMyParentClass[]
に簡単にキャストできますが、List<MyChildClass>
は少なくとも直接ではなくList<MyParentClass>
にキャストできません。
共分散が必要な場合は、配列を使用するか、LINQのCast()メソッドまたはその他の方法を使用して各アイテムを個別にキャストするか C#4 を待ちます。
ここで考えられるもう1つのことは、突然変異です。配列(T[]
)は完全に変更可能であり、保護できません。 List<T>
は便利な拡張ポイントを提供しませんが、Collection<T>
(または他の多くのIList<T>
実装)のようなものを使用すると、コードを追加できます。たとえば、アイテムを追加する前にチェックします。同様に、読み取り専用のparams
実装を使用できます。これは、不変性が望ましいスレッドセーフに役立ちます。
内部メソッドロジック(おそらくローカル変数として)、<=>引数、またはアイテムの長さを知っている高度に最適化されたいくつかのケースでコードを知っている >(プライベートフィールドとして)変異させないことを選択します。それ以外は、アイテムの追加/削除時のオーバーヘッドがはるかに少ないため、<=>などがより一般的です。
コードのその部分が絶対にパフォーマンスに重要でない限り、ArrayListの使用はまったく問題ありません。
さらに良いことに、ArrayList
を使用する場合は常に、代わりにList<T>
ジェネリックコレクションを使用します。前者よりも強く型付けされています。
Javaの観点からこれに答えていますが、それは同じ基本的な問題です。より高い抽象化を使用して罪悪感を感じるべきではありません。結局のところ、あなたはString
の代わりにchar[]
sを使用している、あるいはbyte[]
?さらに一歩進めて、可能であればList
インターフェースを使用することをお勧めします。一歩下がった唯一の理由は、パフォーマンス上の理由です。
より高いコレクション抽象化を使用すると、多くの利点があります。デコレータを追加して、リストを読み取り専用にしたり、サイズを固定したり、コレクションに出入りするアイテムを確認したり、ビューを使用したりできます(C#のGetRange
およびJavaのsubList
を参照)。
ところで、ArrayList
は常にプリミティブ配列に基づいている必要があります。そうでない場合、名前は間違っています。通常、操作は、プリミティブ配列を使用するときに期待する方法で実装されます。リンクされたリストが使用される場合、通常はその名前が付けられます-LinkedList
。これは、インターフェースを使用することの利点でもあります。使用した実装については後から気を変えることができます。
コレクションの使用を不格好にするものがいくつかあります。 1つの注意点は、コレクションは通常オブジェクトに基づいており、言語にはプリミティブタイプとオブジェクトタイプの間にかなりのギャップがあることです。限定されたジェネリックもあまり役に立ちません。それでも、特に理由がない限り、配列よりもコレクションをお勧めします。
プリミティブ値の場合、 GNU Trove などのプリミティブコレクションライブラリの使用を検討することもできます。ただし、C#に類似したものがあるかどうかはわかりません。
Fabulous Adventures In Coding は、やや有害と考えられるアレイ。とても興味深い読み物です。
1つは、特定の型のみを処理する場合は、ArrayListを使用しないでください。たとえば、バイトの配列のみが必要な場合は、バイトの配列のみを受け入れます。
Listの代わりにArrayListを使用することを考えるかもしれません。
配列のサイズは静的なので、設計時にサイズがわかっている場合は、配列を使用します。より高速に動作するはずですが、私は自分でテストしていません。オブジェクトのカウントを頻繁に変更する(コレクションにオブジェクトを追加または削除する)必要がある場合は、ArrayListを使用するか、.NET 2の汎用リストを使用してください。
プリミティブ型の配列が必要な場合は、オートボクシングとアンボクシングを回避するため、パフォーマンスを向上させるために配列を使用します。ただし、事前に必要なサイズがわかっている場合のみ。
このようです。
using System;
using System.Collections;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
//ArrayList
/*
An ArrayList doesn't use a LinkedList as the internal data structure! .we can store any type of objects
*/
ArrayList list = new ArrayList();
list.Add("1"); // not strongly type,you can enter any object types (int,string decimals, etc..)
list.Add(1);
list.Add(1.25);
//Array
/*
must declare length.
*/
string[] array = new string[3]; // you must declare object types
array[0] = "1";
//array[1] = 1; this get error becoz array is storngly typed. // this print empty value when you run it
array[2] = "stongly typed";
Console.WriteLine("------- ARRAYLIST ITEMS ---------");
foreach (var i in list) {
Console.WriteLine(i);
}
Console.WriteLine("--------- ARRAY ITEMS -----------");
foreach (var i in array)
{
Console.WriteLine(i);
}
Console.ReadKey();
}
}
}