Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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>...
背景を説明します
C##2.0からジェネリックが導入され
ジェネリックなコレクションの
クラス、インターフェースが追加されました
(System.Collec-ons.Generic下)
ジェネリックインターフェースの例 (名前の先頭にIがつく)
• IList<T>
• IDic,onary<TKey,5TValue>
ジェネリッククラスの例 (インターフェースじゃなくてクラス)
• List<T>
• Dic+onary<T...
じゃあその前、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;...
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>、IReadOnly...
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を
実装しているか調べてみた
stackoverflow
h"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を引数にとるメソ...
どうでしょう?
あってますかね?
それとももしかして私が知らないだけで、
IListの活用場面多かったりします?
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

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

1,910 views

Published on

2015/01/31の富山合同勉強会 .NET & Java ~ぶりしゃぶで休もう~で発表した際の資料です

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. C#のList<T>がIListを実装している件
  2. 2. 自己紹介
  3. 3. 名前:室星!亮太 所属:Fuller,'Inc.
  4. 4. 2年前までJavaやってました! Androidアプリ開発やってました。
  5. 5. 今はC#やってます! C#(Mono2.x)でUnityでゲーム作ってます!
  6. 6. そんな私がある疑問を ぶつけたいと思います!
  7. 7. C#のList<T>がIListを実装している件 正直IListを実装する必要がないと思ってました そして、ちょっと問題があります
  8. 8. 何が問題か? List<string> stringList = new List<string> (); IList list = stringList; list.Add (1); // コンパイルは通る 実行時に例外発生! List<T>のインスタンスをIListインターフェースの変数に代入 System.ArgumentExcep1onが発生することがある! ※List<T>はC#だとクラスです
  9. 9. 背景を説明します
  10. 10. C##2.0からジェネリックが導入され ジェネリックなコレクションの クラス、インターフェースが追加されました (System.Collec-ons.Generic下)
  11. 11. ジェネリックインターフェースの例 (名前の先頭にIがつく) • IList<T> • IDic,onary<TKey,5TValue> ジェネリッククラスの例 (インターフェースじゃなくてクラス) • List<T> • Dic+onary<TKey,4TValue>
  12. 12. じゃあその前、C##1.0や1.1では?
  13. 13. System.Collec,ons名前空間下の 非ジェネリックな別のコレクション 例えばIListとかIDic(onaryとかArrayListとか あと、System.Collec,ons.Specialized名前空間下にも
  14. 14. ポイント C#のジェネリックコレクションと 非ジェネリックコレクションは 別のクラス・別のインターフェース (ここJavaと違う!)
  15. 15. IListインターフェース と IList<T>インターフェース
  16. 16. IListインターフェース 非ジェネリックなリストを司るインターフェース • メソッドとプロパティの一例 "*"void"Add(Object"value)"要素の追加 "*"Object"this[int"index]"{"get;"set;"}"インデクサ • 継承しているインターフェースはICollec@onとIEnumerable
  17. 17. IList<T>インターフェース(1) ジェネリックなリストを司るインターフェース メソッドとプロパティの一例 • void&Add(T&ietm)&要素の追加 • T&this[int&index]&{&get;&set;&}&インデクサ ジェネリックなメソッドとプロパティに注目!
  18. 18. IList<T>インターフェース(2) 継承しているインターフェース • ICollec(on<T> • IEnumerable<T> • IEnumerable IListインターフェースを継承はしていない!
  19. 19. IListインターフェースとIList<T>インターフェース • メソッドとプロパティは似ているものもある • 非ジェネリックかジェネリックかという大きな違い • 継承関係はない(ここ重要!)
  20. 20. ポイント IList<T>インターフェース実装するからって、 必ずIListインターフェース実装する必要ない
  21. 21. List<T>クラスはどうなっている?
  22. 22. List<T>クラスが実装しているインターフェース • IList'<)ここ注目!!!! • IList<T>'<)あとここも! • ICollec1on • ICollec1on<T> • IReadOnlyList<T>、IReadOnlyCollec1on<T> • IEnumerable<T>、IEnumerable
  23. 23. List<T>クラスはIList<T>を実装 加えて非ジェネリックなIListも 実装していて...
  24. 24. 結果こうなる List<string> stringList = new List<string> (); IList list = stringList; list.Add (1); // System.ArgumentExceptionが発生! 明示的なインターフェースの実装なんちゃらは割愛
  25. 25. List<T>がIList実装しているの必要なくない? IList<T>実装してるから、それでよくない? むしろIList邪魔じゃない?
  26. 26. なぜList<T>はIListを 実装しているか調べてみた
  27. 27. stackoverflow h"p://stackoverflow.com/ques5ons/6156010/why<list<implements<ilist
  28. 28. ジェネリックが導入されたC##2.0/.NET#2.0 が登場した時を想像しましょう
  29. 29. 2005年12月8日
  30. 30. AKB48&劇場で初公演
  31. 31. の1ヶ月前、2005年11月7日 .NET%2.0リリース(wikipediaより)
  32. 32. C#1.0と1.1では 当然全てのコードが非ジェネリック!!! そのため既存のコードは、 引数としてList<T>やIList<T>はとらない!
  33. 33. ここでIListが活躍!
  34. 34. List<T>クラスは IListインターフェースを実装してるおかげで IListを引数にとるメソッドにList<T>を渡せる
  35. 35. 既存のC##1.0/1.1のライブラリで、 IList引数にとるメソッドには List<T>を渡せる!
  36. 36. つまりList<T>がIListを実装したのは、 非ジェネリックコレクションからジェネリックコレクションへの 移行をスムーズに行うため? 既存自作ライブラリがList<T>引数に取れないから使わないを防止するため? 「IListを引数にとるメソッドにList<T>渡せるなら、List<T>使ってみるか!」が狙い?
  37. 37. どうでしょう? あってますかね?
  38. 38. それとももしかして私が知らないだけで、 IListの活用場面多かったりします?
  39. 39. ご清聴ありがとうございました

×