(1) C#のIListとは?Listとの違いや使いどころもご紹介
(1-1) IListやIList<T>とは?
(1-2) Listとの違い
(1-3) IListの利用シーン
(1) C#のIListとは?Listとの違いや使いどころもご紹介
(1-1) IListやIList<T>とは?
「IList」は非ジェネリクスの「インターフェイス」で、「ICollection」を実装しています。
(図111)継承関係
・「IList」は「ICollection」を継承
・「ICollection」は「IEnumerable」を継承
「IList<T>」はジェネリクス(総称型=汎用的な型)のインターフェイスで、「ICollection<T>」インターフェイスと「IEnumerable<T>」インターフェイスを実装しています。
(図112)継承関係
・「IList<T>」は「ICollection<T>」を継承
・「ICollection<T>」は「IEnumerable<T>」を継承
(1-2) Listとの違い
Listは「クラス」なのに対してIListは「インターフェイス」です。
ListクラスはIListインターフェイスを実装しており、List型を扱う事に特化している反面、IListはインターフェイスなので、IListを継承したクラスのインスタンス(Listなど)を受け取る事ができます(※補足1)。
なので、IListの方がより汎用的な型として使う事ができます(List型を入れたり、あるいはIListを継承した独自クラスのインスタンスを入れる事もでき、特にそれらの型を意識せずに汎用的に使える)。
値のアドレスを保持する変数です。「参照型」の対は「値型」で、これらは通常int型などのように「値」そのものを保持した変数です。
対してstringのような「参照型」の変数は、値自体は持たず代わりに値のアドレスを保持しています。
//【OK】 IList<string> ls1 = new List<string>();
(図121)
逆にインターフェイスなので、これ自体をインスタンス化する事はできません。
//【NG】 Ilist<string> ls2 = new IList<string>();
(図122)
(1-3) IListの利用シーン
汎用的なクラスを作りたい場合にも使えます。例えばもしライブラリ等を通じて提供するケースの場合、Fixされた「クラス」としてよりは、「インターフェイス」として提供する方が汎用的に使えて望ましいため、その場合はIListを使います。
そして、IListを使う事で、中身がListであろうと配列であろうと、それらを意識せずに汎用的に使う事ができます。
加えて、foreachにより要素をループするだけであれば、「List<T>」はもちろんの事「IList」すら使わなくても「IEnumerable<T>」で十分です(読む人も「IEnumerable<T>」ならば、要素をforeachでループするのみ、と事前に把握できる=可読性が向上するメリットがある)。