J'écris une classe d'emballage de tableau qui implémente Mon classes désactive l'insertion et l'enlèvement. Il est em> autorise modifier des éléments via le Le MSDN stipule que P>
Une collection en lecture seule ne permet pas l'addition, la suppression ou la modification des éléments après la création de la collecte. P>
blockQuote>
Pour ma classe, cela semble impliquer que je dois retourner Les clients gèrent un code> arbitraire code> et doivent insérer un élément dans celui-ci, si possible em>. Ils peuvent le faire en appelant simplement Mais le résultat de cette propriété sera Assurez-vous, il y a la propriété ilist
ilist
icollection
ceci [int] .set .Setre code> propriété. P>
vrai code> mais dans mes yeux, cela rend la propriété A
Bit del> complètement inutile: autant que je puisse voir , l'utilisation de cette méthode est la suivante: p>
insérer code> et attraper le
notsupportedexception résultant code> - et pour diverses raisons, cela peut ne pas être souhaitable. Ainsi, au lieu de provoquer une exception, les clients peuvent simplement tester la propriété
IsReadonly code> à l'avance. P>
iList.FeCixedSeize code> mais ceci est un type distinct (
ilist
Ilist code>). Que devrais-je faire? Également implémenter
ilist code> (je ne em> pas em> comme cette alternative)? Faire quelque chose d'autre? P>
3 Réponses :
Je pense que pour répondre au contrat tel que défini, vous devez retourner Vous pouvez (en outre) implémenter Si votre appelant vérifie cela est à la hauteur de l'appelant. Un nouveau code de liaison UI sera cependant. P>
ajouté: p>
aussi; vous devriez em> implémenter probablement vrai code>. p>
ibindinglist code> - ceci a
ALOWOWEW code>,
autorisé code> et
allowremove code>. Vous retourneriez
true code> à partir de
autorisé code>, et
false code> à partir des deux autres. P>
iList code> si vous implémentez
ilist
IList code> est important pour un certain nombre de scénarios de réflexion et de liaison, où les types ne sont pas connus à l'avance. P>
Merci - I (encore une fois) complètement oublié de la liaison (je ne l'utilise pas très souvent). Je suivrai vos conseils.
Quelque chose d'autre à considérer ... p>
Votre collection est un wrapper de tableau et il possède une sémantique semblable à une matrice. C'est-à-dire que les éléments ne peuvent pas être insérés ou supprimés, mais ils peuvent être modifiés. P>
Arrays retour Je pense que je voudrais probablement mettre en œuvre Le mot clé dans le remarque de MSDN est le " ou ": p>
Une collection qui est en lecture seule ne permet pas l'addition, le retrait,
ou strong> Modification des éléments après la création de la collection. P>
blockQuote>
Votre collection est em> la modification, donc retourner false code> pour
isreadonly code> et
true code> pour
isfixedSize code>. p>.
iList code> en plus de
ilist
isreadonly code> et
isfixedSize code> est concerné. p>
true code> pour
isreadonly code> enfreindrait ce contrat, à mon avis. P>
IMPORTANT: un tableau renvoie false code> si vous appelez le public
iSReadonly code> propriété. Cette propriété publique est également la mise en œuvre de
ilist.isReadonly code> sur l'interface non générique i>
IList code>. Si le tableau est un "vecteur", c'est un "vecteur", il est unidimensionnel et commence à partir d'index 0 comme des tableaux "ordinaires", le tableau implémente également l'interface générique
IList <> code>. Ensuite, l'interface générique
IList <> code> hérite d'un
isreadonly code> de
icollection <> code>. Ce
Icollection <>. ISReadonly code> est mis en œuvre avec une sorte de mise en œuvre de l'interface explicite "magique". Cette mise en œuvre revient vrai!
Un exemple: int [] arr = {2, 4, 6,}; bool x = arr.isReadonly; / * FALSE * / BOOL Y = ((IList
vrai code> pour la mise en œuvre de l'interface générique i>.
Ici, la sémantique de modification est importante. Il existe une différence entre modifier les éléments d'une collection et modifier les objets contenus par la collection. Pensez aux éléments des espaces réels de la collection. Vous ne pouvez pas ajouter d'espaces, supprimer des espaces ou changer l'objet dans un certain espace. C'est le contrat que isreadonly code> abie. P>
Juste pour ajouter quelque chose, avec Readonlycollection Le contenu peut être modifiable (si mutable) et toujours, la propriété "Isreadonly" retourne vrai ...
@bruno - qui dépend si par "édition de contenu", vous voulez dire Remplacement de B> l'élément à une position donnée (liste [N] = élément) et mutation b> l'élément à une donnée position (liste [n] .SomeProp = valeur).