代わりに IEnumerable<T>、IList<T>、ICollection<T>、Collection<T> のいずれかを使う。
[ 理由 1 ]
List<T> はパフォーマンス向上のために使用するコレクションで、継承は想定されていない。一方、Collection<T> は、継承して独自のコレクションを定義することが可能な (想定されている) コレクション。
このため、外部に公開するプロパティや外部に公開するメソッドの戻り値・パラメータで List<T> を使用することは推奨されていない。
僕は 「List<T> は多態性を持てないから」 と勝手に解釈している。
[ 理由 2 ]
Collection<T> は、IList<T> を受け取るバージョンのコンストラクタを使用することで、コレクションのラッパーとして機能させることができる。すると、Collection<T> 型のフィールドには、仮想プロキシによるレイジーロードなど、別のコレクションを注入することができる。
# List<T> では、IEnumerable<T> を受け取るコンストラクタがあるが、これはコンストラクタ内で要素のコピーを行っており、ラッパーとしては働かない。
[ 注意点 ]
ひとつ気をつけなければならない点として、List<T> は独自の機能を豊富に提供していることが挙げられる。例えば Collection<T> のインスタンスで List<T> の機能を使いたい時は、List<T> に変換する (IEnumerable<T> を受け取るコンストラクタを使う) などしなければならない。
そういうことだったのですね。ありがとうございました。
2008.11.12 17:59 URL | baba #- [ 編集 ]
トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/224-a2fd096e