J'ai une classe personnalisée qui implémente ICollection
, et cette classe est en lecture seule, ie. IsReadOnly
renvoie true (par opposition à l'utilisation du mot-clé readonly
) et toutes les fonctions qui normalement modifieraient les données dans la collection lancent InvalidOperationException
. Maintenant, étant donné une telle construction, et un survol rapide sur les problèmes de sécurité de thread lors de l'implémentation ICollection
(en particulier ICollection.IsSynchronized
et amis), j'ai trouvé cette solution rapide et sale.ICollection, collections en lecture seule et synchronisation. Est-ce correct?
bool ICollection.IsSynchronised { get{ return true; } }
object ICollection.SyncRoot { get{ return new Object(); } }
Maintenant, compte tenu des exemples dans MSDN, cela ne causera pas de threads différents pour verrouiller correctement, car ils deviennent différents objets de SyncRoot
. Étant donné qu'il s'agit d'une collection en lecture seule, est-ce un problème? Y at-il des problèmes de mémoire/GC avec le retour new Object()
? D'autres problèmes que vous pouvez voir avec cette implémentation?
La collection est en effet immuable, il n'y a aucun moyen de la modifier (sauf pour creuser dans la réflexion bien sûr), donc tout ce genre de choses devrait être garanti ne devraient-ils pas? –
Considérez que vos clients peuvent ne pas savoir qu'ils obtiennent une collection immuable. Évidemment, ils n'essaient pas de le modifier (ou ils auront déjà une erreur), mais ils pourraient bien être verrouillés pour s'assurer qu'ils n'échoueraient pas s'ils recevaient une collection mutable. –
Oui, d'accord, ils appellent Syncroot, obtiennent un objet contre lequel se verrouiller, un objet que personne d'autre n'aura jamais, donc le verrou est inutile. Mais devrions-nous vraiment tenir d'autres discussions inutilement? –