5

読み取り専用コレクションのコードを見ると、「Add」メソッドはありませんが、代わりにICollection<T>.Add(T Value)メソッドを定義しています(明示的なインターフェイスの実装)。

ReadOnlyDictionaryクラスで同様のことをしたとき、 FxCop10はCA1033を壊していると文句を言います。

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    //CA1033 ERROR
    void IDictionary<TKey, TValue>.Add(TKey, TValue) { //Throw Exception }
}

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    //NO CA1033 ERROR
    Add(TKey, TValue) { //Throw Exception }
}

ReadOnlyCollectionClass:

public class ReadOnlyCollection<T> : ICollection<T>
{
    void ICollection<T>.Add(T item) { //Throw Exception }
}

それで、これは誤検知ですか?Microsoftのベースコードは悪いですか?何が得られますか?

4

3 に答える 3

5

多くのMicrosoftコードは、FxCopとStyleCopを「失敗」させます。主な理由は、これらのツールが新しいことです。多くのBCLは、誰もが.NETをまったく経験する前に、多くのプログラマーによって作成されました。

この特定のケースでは、誤検知だと思います。しかし、それはあなたが「偽」と言う意味に依存します。コレクションインターフェイスの実行時の性質は、せいぜいおかしなものだと思います。読み取り専用コレクションはLSPに違反していると主張することができます。ただし、明示的な実装は、クラスが実際には(完全な)コレクションではないという「ヒント」として機能します。

于 2011-07-11T21:01:12.070 に答える
1

これはここでは誤検知です。読み取り専用のコレクションでは、が役立つことAdd決してありません。

IList[<T>]インデックスによる読み取りアクセスを提供する有効な/組み込みの読み取り専用の同等物がないため、インターフェイスを満たすためにのみ必要です。

この場合、見えないところに押し込むのは完全に理にかなっています。

于 2011-07-11T21:06:14.083 に答える
1

私はこれについてマークに同意します-それは役に立たないので、可能な限り隠したほうがよいでしょう。まったく同じ理由で、ReadOnlyCollectionにも同様の抑制がある可能性があることも考慮する価値があります。残念ながら、mscorlibのリリースビルドにSuppressMessage属性が含まれていないことを考えると、それが当てはまるかどうかを簡単に知る方法はありません。

.NET Frameworkにはいくつかの一般的なReadOnlyDictionary実装がありますが、既存のバージョンでは公開されていません。それらの少なくとも1つ(System.Dynamic.Utils.ReadOnlyDictionary)は、「変更」メソッドに明示的なインターフェース実装を使用します。

于 2011-07-12T12:09:16.377 に答える