「なぜ」ではないのかという質問の「なぜ」の部分に答えるためにList<T>
、その理由は、将来性とAPIのシンプルさです。
将来を見据えた
List<T>
サブクラス化することで簡単に拡張できるようには設計されていません。内部実装のために高速になるように設計されています。その上のメソッドは仮想ではないのでオーバーライドできないことに気づくでしょう。そのAdd
/ Insert
/ Remove
操作へのフックはありません。
これは、将来的にコレクションの動作を変更する必要がある場合(たとえば、ユーザーが追加しようとするnullオブジェクトを拒否する場合、またはこれが発生したときにクラスの状態を更新するなどの追加の作業を実行する場合)、型を変更する必要があることを意味しますサブクラス化できるコレクションに戻るコレクションの場合、これはインターフェースの重大な変更になります(もちろん、nullを許可しないなどのセマンティクスを変更すると、インターフェースも変更される可能性がありますが、内部クラスの状態の更新などは行われません)。
だから、どちらかの簡単のようなサブクラス化することができるクラス返すことによって、Collection<T>
またはインタフェースのようなIList<T>
、ICollection<T>
またはIEnumerable<T>
あなたはそれがまだとして返すことができるので、消費者のコードを壊すことなく、あなたのニーズを満たすためにさまざまなコレクション型であるためにあなたの内部実装を変更することができますが彼らが期待しているタイプ。
APIのシンプルさ
List<T>
以下のような便利な操作がたくさん含まれているBinarySearch
、Sort
などを。ただし、これが公開しているコレクションの場合は、コンシューマーではなくリストのセマンティクスを制御している可能性があります。したがって、クラスが内部でこれらの操作を必要とする可能性がある一方で、クラスのコンシューマがそれらを呼び出したい(または呼び出す必要がある)可能性はほとんどありません。
そのため、より単純なコレクションクラスまたはインターフェイスを提供することで、APIのユーザーに表示されるメンバーの数を減らし、ユーザーが使いやすくします。