¿Por qué es HashSet .IsReadOnly explícito?
-
09-09-2019 - |
Pregunta
Este
var h = new HashSet<int>();
var r = h.IsReadOnly;
no se compila. Tengo que hacer
var r = ((ICollection<int>)h).IsReadOnly;
¿Por qué no se aplicó IsReadOnly normalmente?
(No estoy pidiendo ¿Cómo , pero ¿Por qué )
Solución
supongo que es porque, mientras que HashSet implementa ICollection, IsReadOnly no tiene sentido para HashSet. De hecho, si se reflexiona, la propiedad siempre devuelve falso. Implementarlo de manera explícita esconde este método de la interfaz pública.
Otra razón es porque la interfaz ICollection puede implementarse debido a razones accidentales (por ejemplo, para apoyar la serialización xaml) en lugar de debido a que su necesario el uso principal de la clase. Así implementarlo de manera explícita puede mantener el desorden fuera de la interfaz de clase.
Otros consejos
Existen básicamente dos razones por las que recurriría a una implementación de interfaz explícita (fuente: MSDN ):
- implementar múltiples interfaces con los miembros que contienen las mismas firmas, y desea que estos miembros se comporten de forma diferente.
- Un miembro de interfaz no es de particular interés para la clase, pero se requiere con el fin de hacer referencia a objetos por la interfaz.
Para HashSet<T>
, el último caso se aplica, como un conjunto de hash nunca es de sólo lectura y por lo tanto siempre habrá IsReadOnly
volver false
.