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?
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.
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.
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.
Tags und Links .net collections msdn