Vertrag von ICollectionT.IsReadOnly

8

Ich schreibe eine Array-Wrapper-Klasse, die IList<T> implementiert. Ich bin mir aber nicht sicher, was ich für IList<T>.IsReadOnly (geerbt von ICollection<T> ) zurückgeben soll.

Meine Klasse verbietet das Einfügen und Entfernen. Es ermöglicht das Ändern von Elementen über die Eigenschaft this[int].set .

Die MSDN gibt das an

  

Eine schreibgeschützte Sammlung erlaubt das Hinzufügen, Entfernen oder Ändern von Elementen nach dem Erstellen der Sammlung nicht.

Für meine Klasse scheint dies zu bedeuten, dass ich true zurückgeben muss, aber in meinen Augen macht dies die Eigenschaft ein -Bit völlig nutzlos: soweit ich das sehen kann, die Verwendung davon Methode ist wie folgt:

Die Clients behandeln ein beliebiges IList und müssen ein Element einfügen, wenn überhaupt möglich . Sie können dies tun, indem Sie einfach Insert aufrufen und die resultierende NotSupportedException abfangen - und aus verschiedenen Gründen ist dies möglicherweise nicht wünschenswert. Anstatt also eine Ausnahme zu provozieren, können die Clients die Eigenschaft IsReadOnly vorher testen.

Aber das Ergebnis dieser Eigenschaft wird falsch sein, weil es die Modifizierbarkeit der Sammlung mit der Modifizierbarkeit ihrer Inhalte mischt - was völlig unabhängige Dinge sind !

Um sicher zu sein, gibt es die Eigenschaft IList.IsFixedSize , aber dies ist ein separater Typ ( IList<T> macht nicht erweitert IList ). Was soll ich machen? Implementiere auch IList (ich mag diese Alternative nicht)? Etwas anderes tun?

    
Konrad Rudolph 02.07.2009, 09:56
quelle

3 Antworten

2

Etwas anderes zu beachten ...

Ihre Sammlung ist ein Array-Wrapper und hat eine Array-ähnliche Semantik. dh Elemente können nicht eingefügt oder entfernt werden, aber sie können geändert werden.

Arrays geben false für IsReadOnly und true für IsFixedSize zurück.

Ich denke, ich würde wahrscheinlich IList zusätzlich zu IList<T> implementieren und dann das Array-Verhalten nachahmen, soweit IsReadOnly und IsFixedSize betroffen sind.

Das Schlüsselwort in der Anmerkung von MSDN ist das "oder":

  

Eine schreibgeschützte Sammlung erlaubt nicht das Hinzufügen, Entfernen,    oder Änderung von Elementen nach dem Erstellen der Sammlung.

Ihre Sammlung erlaubt eine Änderung, also würde die Rückgabe von true für IsReadOnly meiner Meinung nach diesen Vertrag brechen.

    
LukeH 02.07.2009, 14:44
quelle
2

Ich denke, um den Vertrag wie definiert zu erfüllen, müssten Sie true zurückgeben.

Sie könnten (zusätzlich) IBindingList implementieren - das hat AllowNew , AllowEdit und AllowRemove . Sie würden true von AllowEdit und false von den anderen beiden zurückgeben.

Ob der Anrufer dies überprüft, liegt jedoch beim Anrufer. Es wird jedoch viel Code für die Benutzeroberfläche geben.

hinzugefügt:

Auch; Sie sollten wahrscheinlich IList implementieren, wenn Sie IList<T> implementieren; Insbesondere IList ist wichtig für eine Reihe von Reflexions- und Bindungsszenarien, bei denen die Typen nicht vorher bekannt sind.

    
Marc Gravell 02.07.2009 10:07
quelle
1

Hier ist die Semantik der Modifikation wichtig. Es besteht ein Unterschied zwischen dem Ändern der Elemente einer Sammlung und dem Ändern der Objekte, die in der Sammlung enthalten sind. Denken Sie an die Elemente der tatsächlichen Räume in der Sammlung. Sie können keine Leerzeichen hinzufügen, Leerzeichen entfernen oder das Objekt in einem bestimmten Bereich ändern. Das ist der Vertrag, an dem IsReadOnly festhält.

    
Marcus Griep 11.07.2009 03:27
quelle

Tags und Links