Perché HashSet .IsReadOnly esplicito?
-
09-09-2019 - |
Domanda
Questo
var h = new HashSet<int>();
var r = h.IsReadOnly;
non viene compilato. Devo fare
var r = ((ICollection<int>)h).IsReadOnly;
il motivo per cui non è stato implementato IsReadOnly normalmente?
(Non sto chiedendo come , ma perché )
Soluzione
sto cercando di indovinare la sua causa, mentre HashSet implementa ICollection, IsReadOnly ha alcun significato per HashSet. In realtà, se si riflette che, la proprietà restituisce sempre false. L'implementazione in modo esplicito questo metodo nasconde dall'interfaccia pubblica.
Un'altra ragione è che l'interfaccia ICollection può essere implementato per motivi accidentali (ad esempio, per supportare xaml serializzazione) piuttosto che per il suo necessario l'uso primario della classe. Così la sua attuazione in modo esplicito può mantenere il disordine fuori l'interfaccia di classe.
Altri suggerimenti
Ci sono fondamentalmente due ragioni per cui si dovrebbe ricorrere ad un'implementazione dell'interfaccia esplicita (fonte: MSDN ):
- implementare più interfacce con i membri che contengono le stesse firme, e si desidera questi membri a comportarsi in modo diverso.
- Un elemento di interfaccia non è di particolare interesse per la classe, ma è necessaria per fare riferimento a oggetti dall'interfaccia.
Per HashSet<T>
, si applica quest'ultimo caso, come un insieme di hash non è mai sola lettura e IsReadOnly
sarà quindi sempre tornare false
.