2014年9月25日

System.Collections.ObjectModel.Collection<T> について

System.Collections.ObjectModel にある Collection<T> について、ソース観点からの補足説明のようなもの。

主な用途は、継承用クラスになる。
実際、System.Collections.ObjectModel にある他クラスの継承元として使われている。
単品で使用できないこともないが、IList<T> ないし List<T> の単なるラッパになるので(Collection<T> の引数無しコンストラクタは内部で List<T> を生成)、ラップするメリットがあまりない。
List<T> の機能を制限したいなら、基本的にインターフェースへのキャストで十分。

状態変更時に挟める protected メソッドとして、ClearItemsInsertItemRemoveItemSetItem が用意されている。
これらと状態変更用の public メソッド・プロパティとの関係は下記
public protected protectedの実装 備考
Item
(インデクサ)
SetItem IList[index] = item protected メソッド実装時、index 引数の境界値チェックは不要。(public 側で実施済)
Add InsertItem IList.Insert(index, item)
Insert
Remove RemoveItem IList.RemoveAt(index)
RemoveAt
Clear ClearItems IList.Clear()

注意すべきは、Add と Insert で同じ InsertItem メソッドが使われる点。
Add(item) は Insert(Length - 1, item) として処理される。

表でも自明なように IList.Add は使用されない。
自前の IList のラッパーとする場合、IList.Add のみの特殊処理を実装していても使われないので注意。
(普通は IList.Insert と差がある実装にしないだろうけど・・・)

0 件のコメント:

コメントを投稿