0

サードパーティの C API をラップしてインターフェイスする .NET API を作成しようとしています。そのため、API のセマンティクスは次のとおりです。

バイナリ ファイル内の文字列のリストを表すプロパティがあります。このプロパティにはエントリのないリストがあり、その場合、プロパティは空のリストでファイルに書き込まれます。リストは完全に省略されます。この場合、プロパティはファイルから省略されます。

現在の設計では、次のようなものを使用しています。

public class InfoWrapper
{
    // Use an IList<T> to avoid running afoul of FxCop
    // rule CA1002: Do not expose generic lists.
    public IList<string> ItemsContainer { get; set; }
}

もちろん、これでうまくいき、「設定されていない」ケースと「空のリスト」のケースを区別できるようになりますが、実際の問題は、別の FxCop 警告 CA2227: コレクション プロパティは読み取り専用である必要があることです。ユーザーがプロパティに値を設定できるようにする必要があり、null設定後に気が変わった場合はリストに戻る可能性がありますnull。2 つのメソッド (たとえば、DeleteItemsContainer()CreateNewItemsContainer()) を使用して、プロパティを読み取り専用にすることもできますが、実際には、同じ方法で処理する必要があるこれらのプロパティがいくつかあります。プロパティごとに 2 つのメソッドを追加すると、API がかなり乱雑になります。ここでより良いアプローチは何でしょうか?

注: FxCop の警告を抑制して処理を終了することもできますが、これらのルールは一連の提案にすぎません。ただし、可能であれば、これらのガイドライン内にとどまりたいと考えています。

4

2 に答える 2

1

あなたは 2 つの問題を混乱させている (または質問している) と思います: 戻りnull値と空のコレクション、および FxCop 警告をトリガーするパブリック セッターを持つことです。nullタイプが であっても であってListもリターンできるIListので問題ありません。

パブリック セッターに関する FxCop 警告を回避したい場合は、セッターをプライベートにし、そのプロパティの値を設定する別の方法を提供する必要があります。IListのコンストラクターを介して を渡すことができますInfoWrapper。または、コンストラクターでリストを作成し、構築後にすべての項目を追加することが理にかなっている場合。

于 2012-10-30T23:14:53.530 に答える
0

まず、プロパティを読み取り専用にする必要があります。つまり、setter を持たないようにします。ただし、その場合でも、ユーザーがコレクションを変更できるため、別の FxCop 警告が表示されます。

その FxCop 警告を取り除くきれいな方法は、プロパティの定義を を返すものから を返すものに変更することIList<T>ですIEnumerable<T>

このような:

public IEnumerable<string> StringList { get; set; }

Countやインデクサーなどのプロパティがなくても生活できる場合は、を使用IEnumerableすると、クラスのユーザーがリストの内容をいじらないようにすることができます。

(ちなみに、プロパティに名前を付けるときは、「文字列」または「リスト」という用語はお勧めしません。「文字列」はプロパティのセマンティクスを示すものではなく、「リスト」はカプセル化する必要があるコレクションの型を公開します)

于 2012-10-30T23:25:32.323 に答える