7

FxCop の提案と私の個人的な傾向に従って、私が指導しているチームに、可能な限り ReadOnlyCollections を使用するように勧めてきました。リストの受信者がその内容を変更できないようにするためだけに。彼らの理論では、これはパンとバターです。問題は、List<> インターフェースが、あらゆる種類の有用なメソッドを公開するよりリッチであることです。なぜ彼らはその選択をしたのですか?

書き込み可能なコレクションをあきらめて返すだけですか? 読み取り専用のコレクションを返し、書き込み可能なコレクションにラップしますか? ああああ。


更新: ありがとうございます。私はフレームワーク デザイン ガイドラインに精通しており、チームが FxCop を使用してそれを実施している理由です。しかし、このチームは VS 2005 を使用しているため (わかっています、わかっています)、LINQ/Extension メソッドが問題を解決すると言って彼らを悲しませています。

彼らは、List.FindAll() と .FindFirst() が foreach ループを記述するよりも明確になることを学びました。今、私は彼らに ReadOnlyCollections を使用するように勧めています。彼らはその明快さを失います。

たぶん、私が気付いていないより深い設計上の問題があるのでしょう。

-- 申し訳ありませんが、元の投稿で VS2005 の制限について言及する必要がありました。ずっと一緒に住んでるから気づかない。

4

4 に答える 4

7

まず、と をReadOnlyCollection<T>実装IEnumerable<T>IList<T>ます。.NET 3.5 と LINQ のすべての拡張メソッドを使用するとList<T>、クエリに関して元のクラスのほぼすべての機能にアクセスできますReadOnlyCollection<T>

そうは言っても、あなたの最初の質問は私にいくつかの提案をするように導きます...

返品List<T>は悪い設計なので、比較の対象にすべきではありません。 List<T>実装には使用する必要がありますが、インターフェイスにIList<T>は返す必要があります。フレームワーク設計ガイドラインでは、具体的に次のように述べています。

「またはをパブリック API で使用しないでください。」(251ページ)ArrayListList<T>

その点を考慮すれば、ReadOnlyCollection<T>と比べてがまったく不利になることはありませんList<T>。これらのクラスはどちらも と を実装IEnumerable<T>しています。これらIList<T>はとにかく返されるべきインターフェースです。

于 2009-05-28T15:45:03.360 に答える
7

.NET Framework Design Guidelines Second Editionのセクション 8.3.2 :

のサブクラスReadOnlyCollection<T>である を使用するReadOnlyCollection<T>か、まれに、IEnumerable<T>読み取り専用コレクションを表すプロパティまたは戻り値を使用します。

返されるコレクションの意図を表すために、ReadOnlyCollections を使用します。

あなたが話しているList<T>メソッドは、便宜上.NET 2.0に追加されました。C# 3.0 / .NET 3.5 では、拡張メソッドを使用して (および LINQ 演算子も使用して) これらすべてのメソッドReadOnlyCollection<T>(または任意のIEnumerable<T>) を元に戻すことができるため、それらを他の型にネイティブに追加する動機はないと思います。それらがリストにまったく存在するという事実は、現在利用可能であるが 2.0 にはなかった拡張メソッドが存在するため、単なる歴史的なメモです。

于 2009-05-28T15:35:17.060 に答える
3

それらが最初に追加されなかった理由についての洞察はありません。しかし、LINQ ができたので、言語の将来のバージョンでそれらを追加する理由はまったくないと思います。あなたが言及したメソッドは、今日の LINQ クエリで簡単に記述できます。最近では、ほぼすべての操作に LINQ クエリを使用しています。List<T>私が書いた拡張メソッドと競合するため、実際にはこれらのメソッドを使用することに悩まされることがよくありますIEnumerable<T>

于 2009-05-28T15:36:46.840 に答える
0

ジェフの答えには、必要な答えが含まれていると思います。の代わりにReadOnlyCollection<T>、そのサブクラスを返します...VS2008/LINQにアップグレードせずに使用したいメソッドを含めるために自分で実装したもの。

于 2009-05-29T02:29:49.690 に答える