[.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 に出てるのを見つけました。
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 にしないほうがいいよ、 という意味のようです。
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント
>List はパフォーマンスを上げるために拡張性を犠牲にしてるから・・・
virtualにしない事でどれだけパフォーマンスは上がるんだろう?
そんなに変わるものなんでしょうかね?
投稿: BlackB | 2009年4月17日 (金) 09時37分
トラックバックありがとうございます。お返事遅れました。
>つまり、 List はパフォーマンスを上げるために拡張性を犠牲にしてるから、 public にしないほうがいいよ、 という意味のようです。
ふーむ。なるほど!
投稿: 囚人 | 2008年3月 2日 (日) 02時01分