2009-04-13 23 views
12

CettePourquoi HashSet <T> .IsReadOnly explicite?

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)

Répondre

16

Je devine sa cause, alors que HashSet implémente ICollection, IsReadOnly n'a pas de sens pour HashSet. En fait, si vous le reflétez, la propriété renvoie toujours false. L'implémenter cache explicitement cette méthode de l'interface publique.

Une autre raison est que l'interface ICollection peut être implémentée pour des raisons accessoires (par exemple, pour prendre en charge la sérialisation xaml) plutôt que parce qu'elle est nécessaire à l'utilisation principale de la classe. Donc, l'implémenter explicitement peut éviter l'encombrement de l'interface de la classe.

+0

Ah, oui, cela a du sens. HashSet cache aussi IsReadOnly pour la même raison que je suppose, d'où l'erreur de compilation si vous essayez de l'utiliser. –

+0

BTW, vous n'avez pas besoin d'implémenter ICollection pour la sérialisation xaml; les collections doivent implémenter IDictionary ou IList. C'était juste un exemple d'occasions où vous pourriez avoir besoin d'implémenter une interface pour des raisons accidentelles. – Will

5

Il y a essentiellement deux raisons pour lesquelles vous avoir recours à une implémentation d'interface explicite (source: MSDN):

  1. Vous implémenter plusieurs interfaces avec les membres contenant les mêmes signatures, et vous voulez que ces membres se comportent différemment.
  2. Un membre d'interface ne présente pas d'intérêt particulier pour la classe, mais est requis pour référencer des objets par l'interface.

Pour HashSet<T>, ce dernier cas applique, comme un ensemble de hachage est en lecture seule et ne IsReadOnly sera donc toujours revenir false.