8

を実装する配列ラッパー クラスを作成していますIList<T>。ただし、何を返すかはわかりませんIList<T>.IsReadOnly(から継承ICollection<T>)。

私のクラスでは、挿入と削除が禁止されています。プロパティを介してアイテムを変更できますthis[int].set

MSDNは次のように述べています。

読み取り専用のコレクションでは、コレクションの作成後に要素を追加、削除、または変更することはできません。

私のクラスでは、これは私が戻らなければならないことを意味しているように見えますtrueが、私の目にはこれはプロパティをレンダリングします少し完全に役に立たない: 私が見る限り、このメソッドの使用法は次のとおりです。

クライアントは任意の を処理し、可能であればIListそれに要素を挿入する必要があります。これは、結果を呼び出してキャッチするだけで実行できますが、さまざまな理由から、これは望ましくない場合があります。そのため、例外を引き起こす代わりに、クライアントは事前にプロパティをテストすることができます。InsertNotSupportedExceptionIsReadOnly

しかし、コレクションの変更可能性とそのコンテンツの変更可能性が混在しているため、このプロパティの結果は間違っています。これはまったく関係のない問題です。

確かに、IList.IsFixedSizeプロパティはありますが、これは別の型です ( IList<T>does not extends IList)。私は何をすべきか?また、実装しますかIList(私は本当にこの代替手段が好きではありません)? 何か他のことをしますか?

4

3 に答える 3

2

考慮すべき他の何か...

コレクションは配列ラッパーであり、配列のようなセマンティクスがあります。つまり、アイテムを挿入または削除することはできませんが、変更することはできます。

配列はとをfalse返します。IsReadOnlytrueIsFixedSize

IListアレイの動作に加えて実装し、IList<T>それを模倣することになると思います。IsReadOnlyIsFixedSize

MSDNからのコメントのキーワードは、「または」です。

読み取り専用のコレクションでは、コレクションの作成後に要素を追加、削除、または変更することはできません 。

あなたのコレクション変更を許可しているので、私の意見では、戻っtrueてくるとその契約が破られることになります。IsReadOnly

于 2009-07-02T14:44:27.540 に答える
2

規定どおりの契約を履行するには、返品する必要があると思いますtrue

(さらに)実装できますIBindingList-これにはAllowNewAllowEditおよびがありAllowRemoveます。trueからAllowEdit、およびfalse他の 2 つから戻ります。

ただし、発信者がこれをチェックするかどうかは、発信者次第です。ただし、多くの UI バインディング コードはそうします。

追加した:

また; 実装している場合、おそらく実装IListする必要がありますIList<T>。特に、IListタイプが事前にわからない多くのリフレクションおよびバインディング シナリオにとって重要です。

于 2009-07-02T10:07:10.487 に答える
1

ここでは、変更のセマンティクスが重要です。コレクションの要素を変更することと、コレクションに含まれるオブジェクトを変更することには違いがあります。コレクション内の実際の空間の要素について考えてみてください。スペースを追加したり、スペースを削除したり、特定のスペース内のオブジェクトを変更したりすることはできません。それがIsReadOnly守られる契約です。

于 2009-07-11T03:27:49.570 に答える