C#のListとIListの違いとは?インターフェースと具象クラスの使い分けを解説
C#におけるListとIListの主な違いは、Listがインデックスでアクセスできるオブジェクトのリストを表す「クラス(具象型)」であるのに対し、IListは同じくインデックスでアクセス可能なオブジェクトのコレクションを表す「インターフェース」であるという点です。IListインターフェースは、ICollectionとIEnumerableという2つのインターフェースから派生しています。
ListとIListはどちらもオブジェクトの集合を扱うために使用され、整数や文字列などさまざまな型のオブジェクトを格納できます。また、要素の挿入・削除・検索・並べ替えを行うためのメソッドも共通して提供されています。
両者の最大の違いは、Listが具体的な実装を持つ具象クラスである一方、IListは実装を持たないインターフェースだということです。つまり、ListはIListインターフェースを実装した具象型であり、実際の開発ではListのインスタンスをIList型の変数に代入して利用するのが一般的なパターンとなります。
例1:IListは直接インスタンス化できない
IListはインターフェースのため、newキーワードで直接インスタンスを生成することはできません。以下のコードはエラーになります。
using System;
using System.Collections.Generic;
namespace DemoApplication {
class Demo {
static void Main(string[] args) {
IList<string> ilist = new IList<string>();
// IListはインターフェースのため、
// インスタンスを生成できずエラーになる
ilist.Add("Mark");
ilist.Add("John");
foreach (string list in ilist) {
Console.WriteLine(list);
}
}
}
}例2:正しい使い方
IList型の変数には、IListを実装した具象クラス(例:List)のインスタンスを代入します。以下のように記述するのが正しい使い方です。
using System;
using System.Collections.Generic;
namespace DemoApplication {
class Demo {
static void Main(string[] args) {
// ListのインスタンスをIList型の変数に代入
IList<string> ilist = new List<string>();
ilist.Add("Mark");
ilist.Add("John");
List<string> list = new List<string>();
list.Add("Mark");
list.Add("John");
foreach (string lst in ilist) {
Console.WriteLine(lst);
}
foreach (string lst in list) {
Console.WriteLine(lst);
}
Console.ReadLine();
}
}
}出力結果
上記コードの実行結果は次のとおりです。
Mark John Mark John
使い分けのポイント
変数やメソッドの引数・戻り値の型としてIListを指定すると、実装の詳細に依存しない柔軟なコードになり、後から別のIList実装へ差し替えやすくなります。一方、AddRangeやFindAllといったList固有のメソッドを使いたい場合や、パフォーマンスを重視する場面では、直接List型を使用するのが適切です。
-
DirectX11とDirectX12の違いを徹底解説!ゲーマーが知っておくべきポイント
DirectXは、ソフトウェアがマルチメディアコンテンツを描画し、グラフィックハードウェアと通信するために使用されるAPI(アプリケーションプログラミングインターフェース)のコレクションです。DirectXの主要な構成要素であるDirect3Dは、ソフトウェアとグラフィックスハードウェア間の通信を担っています。ハードウェアは製品ごとに異なるため、標準化された関数や呼び出しのライブラリを通じてグラフィックカードと通信することで、ゲーム開発を大幅にスピードアップできます。これは「ハードウェア抽象化」と呼ばれ、APIの最も重要な役割となっています。車に例えてみましょう。1台の車の運転ができれば、ほぼ
-
Pythonのリストとタプルの違いとは?特徴と使い分けのポイントを解説
Pythonでは複数の値をまとめて扱えるシーケンス型として、リスト(list)とタプル(tuple)がよく使われます。どちらも似たような役割を持っていますが、決定的な違いがあります。それはタプルが「不変(immutable)」であるという点です。 最大の違い:タプルは変更できない タプルは一度作成すると、その中の値を後から変更することができません。一方、リストは「可変(mutable)」なので、作成後でも要素の追加・削除・変更が自由に行えます。 # リスト:変更可能 my_list = [1, 2, 3] my_list[0] = 10 # 正常に変更できる # タプル:変更不可 my_