2009-07-02 13 views
8

私はIList<T>を実装する配列ラッパークラスを作成しています。私はIList<T>.IsReadOnlyICollection<T>から継承)の返品について確信が持てません。Contract of ICollection .IsReadOnly

私のクラスでは挿入と削除ができません。 はで、this[int].setプロパティでアイテムを変更できます。

MSDN状態

読み取り専用で、コレクションが作成された後の要素の追加、削除、または変更を許可しないコレクションという。私のクラスのために

、これは完全に役に立たないビットを私はtrueを返すために持っていますが、私の目には、このプロパティをレンダリングすることを意味するようだ:次のように私の知る限り、この方法を使用することです:

クライアントは任意のIListを処理し、要素を挿入する必要があります()。可能であればです。彼らはInsertと呼んで、結果としてNotSupportedExceptionをキャッチすることでこれを行うことができます。これはさまざまな理由から望ましいことではありません。したがって、例外を引き起こす代わりに、クライアントはあらかじめIsReadOnlyプロパティをテストすることができます。

しかし、それは、その内容の修正可能で、コレクションの修正可能性をミックスしているため、このプロパティの結果は、間違っになります - 全く関係のない問題である!確かに

は、IList.IsFixedSizeプロパティがありますが、これは別のタイプ(IList<T>IListを拡張しませんが)です。私は何をすべきか?また、IList(私は実際にを実装しないでくださいこの代替のような)?他に何かしますか?

+1

ReadOnlyCollection でコンテンツを変更することはできますが(変更可能な場合)、「IsReadOnly」プロパティはtrueを返します。 –

+0

@bruno - "コンテンツの編集"を意味するかどうかによって異なります** **指定された位置(list [n] = item)のアイテム、**指定された位置(list [n] .SomeProp = value)の**アイテムを変更する**。 –

答えて

2

検討する何か他のもの...

あなたのコレクションには、配列のラッパーであり、それはいくつかの配列のような意味を持っています。アイテムは挿入または削除できませんが、変更できます。

アレイは、IsReadOnlyの場合はfalseIsFixedSizeの場合はtrueの場合に戻ります。

私はおそらくIList<T>に加えてIListを実装して、次にIsReadOnlyIsFixedSizeという配列の動作を模倣していると思います。読み取り専用で追加、削除、要素の または修正コレクションが作成された後にすることはできません

コレクション:

remark from MSDNでのキーワードは「か」です。

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

+0

重要: 'IsReadOnly'プロパティを呼び出すと、配列は' false'を返します。このパブリックプロパティは、非総称***インターフェース 'IList'に' IList.IsReadOnly'を実装したものです。配列が「ベクトル」、すなわち1次元であり、「普通の」配列のようにインデックス0から始まる場合、配列はまた、汎用インターフェース「IList <>」を実装する。次に、汎用インターフェース 'IList <>'は 'ICollection <>'から 'IsReadOnly'を継承します。この 'ICollection <>。IsReadOnly'は、ある種の"魔法の "明示的なインターフェース実装で実装されています。この実装はtrueを返します。 –

+1

例: 'int [] arr = {2、4、6、}; bool x = arr.IsReadOnly;/* false */bool y =((IList )arr).IsReadOnly;/* true! */'したがって、askerが配列のように動作したい場合、_generic_インターフェースの実装のために' true'を返すべきです。 –

2

私が定義した契約を満たすためには、trueを返さなければならないと思います。

IBindingListを実装することもできます(AllowNewAllowEditAllowRemove)。あなたはtrueAllowEditから返し、他の2つからはfalseを返します。

あなたの発信者がこれを確認するかどうかは、発信者が決定します。しかし、多くのUIバインディングコードが使用されます。

追加:

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

+0

ありがとう - 私は(もう一度)私は非常に頻繁に使用しないバインディングを完全に忘れてしまった。私はあなたの助言に従います。 –

1

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

関連する問題