2009-04-13 11 views
12

QuestoPerché HashSet <T> .IsReadOnly esplicito?

var h = new HashSet<int>(); 
var r = h.IsReadOnly; 

non viene compilato. Devo fare

var r = ((ICollection<int>)h).IsReadOnly; 

perché IsReadOnly non è stato implementato normalmente?

(Non sto chiedendo come, ma perché)

risposta

16

sto cercando di indovinare la sua causa, mentre HashSet implementa ICollection, IsReadOnly ha alcun significato per HashSet. Infatti, se lo rifletti, la proprietà restituisce sempre false. L'implementazione nasconde esplicitamente questo metodo dall'interfaccia pubblica.

Un altro motivo è perché l'interfaccia ICollection può essere implementata a causa di motivi accidentali (ad esempio, per supportare la serializzazione xaml) piuttosto che perché è necessaria per l'uso primario della classe. Quindi implementarlo in modo esplicito può mantenere la confusione fuori dall'interfaccia della classe.

+0

Ah, sì, questo ha senso. HashSet nasconde anche IsReadOnly per lo stesso motivo, suppongo, quindi l'errore di compilazione se si tenta di usarlo. –

+0

BTW, non è necessario implementare ICollection per la serializzazione xaml; le raccolte devono implementare IDictionary o IList. Era solo un esempio di occasioni in cui potrebbe essere necessario impiantare un'interfaccia per ragioni accessorie. – Will

5

Ci sono fondamentalmente due ragioni per cui si dovrebbe ricorrere ad un'implementazione dell'interfaccia esplicita (fonte: MSDN):

  1. di implementare più interfacce con i membri che contengono le stesse firme, e si desidera questi membri a comportarsi in modo diverso.
  2. Un membro dell'interfaccia non è di particolare interesse per la classe, ma è necessario per fare riferimento agli oggetti tramite l'interfaccia.

Per HashSet<T>, quest'ultimo caso si applica, come un insieme di hash non è mai sola lettura e IsReadOnly sarà quindi sempre tornare false.

Problemi correlati