2

FxCopには、クライアントが設定できるある種のコレクションプロパティがクラスにある場合に文句を言うCollectionPropertiesShouldBeReadOnlyルールがあります。代わりに、プロパティを読み取り専用にし、コレクションの内容を変更するためのClear()メソッドとAdd()またはAddRange()メソッドを提供することをお勧めします。

私はそれがよりクリーンでより制御されたインターフェースになることに同意しますが、私はそのインターフェースをSpringフレームワークで動作させるのに苦労しています。コラボレーターのコレクションを使用してオブジェクトを構成する場合は、コラボレーターを注入するためのコレクションプロパティを公開する必要があります。Springのドキュメントを調べましたが、SpringにAddRange()メソッドを呼び出すように指示する方法がわかりません。何かが足りませんか?

今のところ、Springの構成に必要であることに注意して、警告を除外します。

更新:過去2か月間、ここでニブルを取得しなかったため、FxCopフォーラムに同じ質問を投稿しました。

4

2 に答える 2

3

コレクション プロパティにゲッターのみが公開されている場合は、一覧表示された FxCop 推奨パターンが使用され、コレクションに追加されると見なされます。最初のパターンもサポートされています。

ジェネリック コレクションの場合、これは、公開されたプロパティが IList 型である場合にのみ機能します。これを修正するために、次のリリースのJIRA の問題があります。ところで、これは基本クラス ライブラリの非常に一般的なパターンです (おそらくご存じのとおり...) .NET 1.1 でこのスタイルをサポートする必要性に最初に遭遇した場所です (上記の制限の影響を受けません)。 .

乾杯、マーク

于 2008-12-30T20:21:55.760 に答える
2

問題はあなたが思うほど悪いものですか?私の理解では、次のような読み取り/書き込みプロパティがある場合、FxCop は文句を言います。

public List<Foo> Items { get; set; }

...あなたのクラスのユーザーはこれを行うことができるからです:

myInstance.Items = new List<Foo>();

明らかに、クラスのユーザーがリストを完全に再割り当てすることは望ましくありません。したがって、FxCop は次のパターンを推奨します。

private List<Foo> _items = new List<Foo>();
public List<Foo> Items { get { return _items; } }

そのため、クラスのユーザーは、リストの新しいインスタンスで上書きするのではなく、リストから項目を追加および削除することしかできません。

Spring.NET はそのコレクション プロパティをどのように実装しますか? 私の最初の例のように、それらは本当に読み取り/書き込みですか? もしそうなら、そのようなパターンのユースケースを見るのは興味深いでしょう.なぜなら、それは正しくないようです.

于 2008-12-28T23:27:43.953 に答える