Tengo una clase personalizada que implementa ICollection
, y esta clase es de solo lectura, es decir. IsReadOnly
devuelve verdadero (en lugar de usar la palabra clave readonly
), y todas las funciones que normalmente modificarían los datos en la colección arrojan InvalidOperationException
.ICollection, colecciones de solo lectura y sincronización. ¿Es esto correcto?
Ahora, teniendo en cuenta tal construcción, y una rápida revisión de los problemas de seguridad del hilo al implementar ICollection
(específicamente ICollection.IsSynchronized
y amigos), se me ocurrió esta solución rápida y sucia.
bool ICollection.IsSynchronised { get{ return true; } }
object ICollection.SyncRoot { get{ return new Object(); } }
Ahora, teniendo en cuenta los ejemplos de MSDN, esto no va a causar diferentes hilos para bloquear correctamente, debido a que están recibiendo diferentes objetos de SyncRoot
. Sin embargo, dado que esta es una colección de solo lectura, ¿es esto un problema? ¿Hay problemas de memoria/GC con la devolución de new Object()
? ¿Algún otro problema que pueda ver con esta implementación?
La colección es, de hecho, inmutable, no hay forma de modificarla (excepto para cavar en la reflexión, por supuesto), por lo que todo este tipo de cosas deberían estar garantizadas, ¿no? –
Considere que sus clientes pueden no saber que están obteniendo una colección inmutable. Obviamente, no están tratando de modificarlo (o ya obtendrán un error) pero es posible que se estén bloqueando para asegurarse de que no fallen si se les proporciona una colección mutable. –
Sí, de acuerdo, llaman a Syncroot, obtienen un objeto para bloquear, un objeto que nadie más obtendrá, por lo que el bloqueo es inútil. Pero, ¿deberíamos realmente sostener otros hilos innecesariamente? –