Pourquoi est-HashSet .IsReadOnly explicite?
-
09-09-2019 - |
Question
var h = new HashSet<int>();
var r = h.IsReadOnly;
ne compile pas. Je dois faire
var r = ((ICollection<int>)h).IsReadOnly;
pourquoi n'a pas été mis en œuvre IsReadOnly normalement?
(Je ne demande pas comment , mais pourquoi )
La solution
Je devine sa cause, alors que HashSet implémente ICollection, IsReadOnly n'a pas de sens pour HashSet. En fait, si vous réfléchissiez elle, la propriété renvoie toujours false. Sa mise en œuvre se cache explicitement cette méthode de l'interface publique.
Une autre raison est que l'interface ICollection peut être mis en œuvre pour des raisons accessoires (par exemple, pour soutenir sérialisation XAML) plutôt que parce que son nécessaire à l'utilisation première de la classe. Ainsi, sa mise en œuvre peut explicitement garder l'image de fond de la classe interface.
Autres conseils
Il y a essentiellement deux raisons pour lesquelles vous avoir recours à une implémentation d'interface explicite (source: MSDN ):
- Vous implémenter plusieurs interfaces avec les membres contenant les mêmes signatures, et vous voulez que ces membres se comportent différemment.
- Un membre d'interface ne sont pas d'un intérêt particulier à la classe, mais il est nécessaire pour référencer des objets par l'interface.
Pour HashSet<T>
, ce dernier cas applique, comme un ensemble de hachage est jamais lu seulement et IsReadOnly
va donc toujours revenir false
.