39
C#List<T>IListを実装している件

C#のList_TがIListを実装している件

Embed Size (px)

Citation preview

C#のList<T>がIListを実装している件

自己紹介

名前:室星!亮太所属:Fuller,'Inc.

2年前までJavaやってました!Androidアプリ開発やってました。

今はC#やってます!C#(Mono2.x)でUnityでゲーム作ってます!

そんな私がある疑問をぶつけたいと思います!

C#のList<T>がIListを実装している件正直IListを実装する必要がないと思ってました

そして、ちょっと問題があります

何が問題か?List<string> stringList = new List<string> ();IList list = stringList;

list.Add (1); // コンパイルは通る 実行時に例外発生!

List<T>のインスタンスをIListインターフェースの変数に代入System.ArgumentExcep1onが発生することがある!

※List<T>はC#だとクラスです

背景を説明します

C##2.0からジェネリックが導入されジェネリックなコレクションの

クラス、インターフェースが追加されました(System.Collec-ons.Generic下)

ジェネリックインターフェースの例 (名前の先頭にIがつく)

• IList<T>

• IDic,onary<TKey,5TValue>

ジェネリッククラスの例 (インターフェースじゃなくてクラス)

• List<T>

• Dic+onary<TKey,4TValue>

じゃあその前、C##1.0や1.1では?

System.Collec,ons名前空間下の非ジェネリックな別のコレクション

例えばIListとかIDic(onaryとかArrayListとか

あと、System.Collec,ons.Specialized名前空間下にも

ポイントC#のジェネリックコレクションと非ジェネリックコレクションは別のクラス・別のインターフェース

(ここJavaと違う!)

IListインターフェースと

IList<T>インターフェース

IListインターフェース非ジェネリックなリストを司るインターフェース• メソッドとプロパティの一例"*"void"Add(Object"value)"要素の追加"*"Object"this[int"index]"{"get;"set;"}"インデクサ

• 継承しているインターフェースはICollec@onとIEnumerable

IList<T>インターフェース(1)

ジェネリックなリストを司るインターフェースメソッドとプロパティの一例• void&Add(T&ietm)&要素の追加

• T&this[int&index]&{&get;&set;&}&インデクサジェネリックなメソッドとプロパティに注目!

IList<T>インターフェース(2)

継承しているインターフェース• ICollec(on<T>

• IEnumerable<T>

• IEnumerable

IListインターフェースを継承はしていない!

IListインターフェースとIList<T>インターフェース• メソッドとプロパティは似ているものもある

• 非ジェネリックかジェネリックかという大きな違い

• 継承関係はない(ここ重要!)

ポイントIList<T>インターフェース実装するからって、必ずIListインターフェース実装する必要ない

List<T>クラスはどうなっている?

List<T>クラスが実装しているインターフェース• IList'<)ここ注目!!!!

• IList<T>'<)あとここも!

• ICollec1on

• ICollec1on<T>

• IReadOnlyList<T>、IReadOnlyCollec1on<T>

• IEnumerable<T>、IEnumerable

List<T>クラスはIList<T>を実装加えて非ジェネリックなIListも

実装していて...

結果こうなるList<string> stringList = new List<string> ();

IList list = stringList;

list.Add (1); // System.ArgumentExceptionが発生!

明示的なインターフェースの実装なんちゃらは割愛

List<T>がIList実装しているの必要なくない?IList<T>実装してるから、それでよくない?

むしろIList邪魔じゃない?

なぜList<T>はIListを実装しているか調べてみた

stackoverflowh"p://stackoverflow.com/ques5ons/6156010/why<list<implements<ilist

ジェネリックが導入されたC##2.0/.NET#2.0

が登場した時を想像しましょう

2005年12月8日

AKB48&劇場で初公演

の1ヶ月前、2005年11月7日.NET%2.0リリース(wikipediaより)

C#1.0と1.1では当然全てのコードが非ジェネリック!!!

そのため既存のコードは、引数としてList<T>やIList<T>はとらない!

ここでIListが活躍!

List<T>クラスはIListインターフェースを実装してるおかげでIListを引数にとるメソッドにList<T>を渡せる

既存のC##1.0/1.1のライブラリで、IList引数にとるメソッドには

List<T>を渡せる!

つまりList<T>がIListを実装したのは、

非ジェネリックコレクションからジェネリックコレクションへの

移行をスムーズに行うため?

既存自作ライブラリがList<T>引数に取れないから使わないを防止するため?

「IListを引数にとるメソッドにList<T>渡せるなら、List<T>使ってみるか!」が狙い?

どうでしょう?あってますかね?

それとももしかして私が知らないだけで、IListの活用場面多かったりします?

ご清聴ありがとうございました