« TFS のローカルキャッシュ | トップページ | TFS のトラブルシュート用リンクいろいろ »

2008年2月25日 (月)

[.NET] CA1002

なんか誰も書いてないみたい ( というか、 ぐぐる様に引っかからない ) なので、 メモ。

囚人のジレンマな日々CA1002 で、  コード分析 ( FxCop ) のこの警告が謎だ、 みたいな話が出てます。

ちなみに、 VS2008 正規版でのヘルプを見ると、 こんなふう

規則の説明
System.Collections.Generic.List<(Of <(T>)>) は 継承ではなくパフォーマンスを目的としたジェネリック コレクションであるため、 仮想メンバは含まれません。 継承を目的としたジェネリック コレクションを次に示します。 公開するときは System.Collections.Generic.List<(Of <(T>)>) ではなく、 これを使用してください。
・ System.Collections.ObjectModel.Collection<(Of <(T>)>)
・ System.Collections.ObjectModel.ReadOnlyCollection<(Of <(T>)>)
・ System.Collections.ObjectModel.KeyedCollection<(Of <(TKey, TItem>)>)

パフォーマンスを目的としたジェネリック コレクションだから公開してはいけない? (@@;

詳しい解説が、 Code Analysis Team Blog に出てるのを見つけました。

FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection<T> instead of List<T>? [David Kean]

2つ理由を挙げています。 一つめだけを紹介します。

List<T> と Collection<T> のどちらかを使って、 Ver.1 をリリースしたとします。 Ver.2 を作るときに、 「データを追加・削除したときにイベントを起こしてくれ」 と言われたとします。 そうしたとき、 List<T> を使っていたら…

There is no way to be notified (without breaking existing clients) of when an external object modifies the collection. However, had you chose to expose Collection<T>, you can now do something like the following

( …既存のプログラムが動かなくなるような方法でしか通知を上げられない。 しかし、 Collection<T> で公開していれば、 次のようにして改修できるよ… )

つまり、 List<T> はパフォーマンスを上げるために拡張性を犠牲にしてるから、 public にしないほうがいいよ、 という意味のようです。

|

« TFS のローカルキャッシュ | トップページ | TFS のトラブルシュート用リンクいろいろ »

プログラミング」カテゴリの記事

コメント

>List はパフォーマンスを上げるために拡張性を犠牲にしてるから・・・

virtualにしない事でどれだけパフォーマンスは上がるんだろう?
そんなに変わるものなんでしょうかね?

投稿: BlackB | 2009年4月17日 (金) 09時37分

トラックバックありがとうございます。お返事遅れました。

>つまり、 List はパフォーマンスを上げるために拡張性を犠牲にしてるから、 public にしないほうがいいよ、 という意味のようです。

ふーむ。なるほど!

投稿: 囚人 | 2008年3月 2日 (日) 02時01分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [.NET] CA1002:

» re: ArrayListよりジェネリックのList [倉田 有大のblog]
re: ArrayListよりジェネリックのList [続きを読む]

受信: 2009年3月 9日 (月) 12時57分

» re: List()を継承してはいけない。・・ならば・・ [倉田 有大のblog]
re: List()を継承してはいけない。・・ならば・・ [続きを読む]

受信: 2009年4月16日 (木) 15時36分

» [.NET] Generic の List を継承してはいけない。 …なんて、 誰が言いだしたんだろう? [biac の それさえもおそらくは幸せな日々@nifty]
倉田 有大のblog より。 List()を継承してはいけない。・・ならば・・投稿日 : 2009年4月16日 14:50 委譲すればいいんでないかい? たしかに、 委譲で作った方が後々良いことがあるかと思うです。 アプリケーションのフレームワーク部分などのように、 拡張性を考えておかないといけないところでは、 委譲で... [続きを読む]

受信: 2009年4月16日 (木) 18時42分

« TFS のローカルキャッシュ | トップページ | TFS のトラブルシュート用リンクいろいろ »