1. ホーム
  2. c#

[解決済み] C#: List<T> と Collection<T> の違い (CA1002、汎用リストを公開しない) [duplicate]

2023-02-07 03:31:33

質問

ここのプロジェクトでコード解析を実行しようとしたところ、このような内容の警告が多数表示されました。

CA1002 。Microsoft.Design .NET List< を変更します。 SomeType >'を' SomeClass.SomeProtectedOrPublicProperty。 ' で、Collection、ReadOnlyCollection、KeyedCollectionのいずれかを使用します。

なぜ Collection<T> の代わりに List<T> ? msdnのドキュメントを見ると、両者はほぼ同じようです。警告のエラーヘルプを読んだ後、私は次のことを発見しました。

System.Collections.Generic.List(T)_is a generic collection designed for performance not inheritance and therefore, does not contain any virtual members.System.Collections.Generic.List(T)_is a generic collection designed for performance not inheritance and therefore, not contain any virtual members.

しかし、これは本当に意味があるのでしょうか?そして、代わりに何をすべきなのでしょうか?

を使い続けるべきなのでしょうか? List<T> を内部で使い続け、プロパティで new Collection<T>(someList) を返しますか?それとも Collection<T> の代わりに List<T> ?

どのように解決するのですか?

要するに、汎用リストは拡張性ではなく高速性を重視して設計されているため、AddやRemoveなどの仮想メソッドを持ちません。これは、この具象実装を有用なサブクラスに交換できないことを意味します (シールされていないためサブクラス化できるにもかかわらず)。

したがって、リスト自体を公開することによって、クラスの公開契約を破ることなく、追加または削除操作を追跡するためにコレクションを拡張することは決してできません (たとえば、)。

IList またはそのようなものとしてコレクションを公開することによって、実際のバッキングストアとしてまだ List を使用することができますが、クラスのパブリック契約を変更せずに後で具体的な実装を交換することができるので、将来の拡張性を保持します。