È una buona forma farlo quando il membro non ha senso nel contesto. Ad esempio, se crei una raccolta di sola lettura che implementa IList<T>
delegando a un oggetto interno _wrapped
, potresti avere qualcosa del tipo:
public T this[int index]
{
get
{
return _wrapped[index];
}
}
T IList<T>.this[int index]
{
get
{
return this[index];
}
set
{
throw new NotSupportedException("Collection is read-only.");
}
}
public int Count
{
get { return _wrapped.Count; }
}
bool ICollection<T>.IsReadOnly
{
get
{
return true;
}
}
Qui abbiamo quattro casi diversi.
public T this[int index]
è definito dalla nostra classe piuttosto che dall'interfaccia, e quindi non è ovviamente un'implementazione esplicita, sebbene si noti che è simile al read-write T this[int index]
definito nell'interfaccia ma viene letto -Solo.
T IList<T>.this[int index]
è esplicito perché una parte di esso (il getter) è perfettamente abbinata alla proprietà sopra, e l'altra parte genererà sempre un'eccezione. Sebbene sia di vitale importanza per qualcuno che accede a un'istanza di questa classe attraverso l'interfaccia, è inutile che qualcuno lo usi attraverso una variabile del tipo della classe.
Analogamente, poiché bool ICollection<T>.IsReadOnly
restituirà sempre true, è assolutamente inutile codificare ciò che è scritto rispetto al tipo della classe, ma potrebbe essere essenziale per utilizzarlo attraverso il tipo di interfaccia, e quindi lo implementiamo esplicitamente.
Al contrario, public int Count
non viene implementato esplicitamente perché potrebbe essere potenzialmente utile a qualcuno che utilizza un'istanza tramite il proprio tipo.
Ma con il tuo caso di "uso molto raro", mi prendo molto in considerazione per non utilizzare un'implementazione esplicita.
Nei casi in cui raccomando l'uso di un'implementazione esplicita, chiamare il metodo attraverso una variabile del tipo della classe potrebbe essere un errore (tentare di usare il setter indicizzato) o inutile (controllare un valore che sarà sempre lo stesso) così nascondendoli si sta proteggendo l'utente da codice bacato o sub-ottimale. Questo è significativamente diverso dal codice che pensi sia probabilmente usato raramente . Per questo potrei considerare di usare l'attributo EditorBrowsable
per nascondere il membro da intellisense, anche se ne sarei stanco; I cervelli delle persone hanno già il loro software per filtrare ciò che non li interessa.