È una buona forma farlo quando il membro è inutile 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 ovviamente non è un'implementazione esplicita, sebbene si noti che sembra essere simile alla lettura-scrittura T this[int index]
definita nell'interfaccia ma è di sola lettura.
T IList<T>.this[int index]
è esplicito perché una parte di esso (il getter) è perfettamente abbinata dalla proprietà sopra e l'altra parte genererà sempre un'eccezione. Mentre è vitale per qualcuno accedere a un'istanza di questa classe tramite l'interfaccia, è inutile che qualcuno la usi attraverso una variabile del tipo di classe.
Allo stesso modo perché bool ICollection<T>.IsReadOnly
tornerà sempre vero, è assolutamente inutile il codice scritto contro il tipo di classe, ma potrebbe essere vitale per usarlo 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 attraverso il proprio tipo.
Ma con il tuo caso "usato molto raramente", mi spingerei molto fortemente a non usare un'implementazione esplicita.
Nei casi in cui consiglio di utilizzare un'implementazione esplicita che chiama il metodo tramite una variabile del tipo di classe, si tratterebbe di un errore (tentativo di utilizzare il setter indicizzato) o inutile (controllo di un valore che sarà sempre lo stesso), quindi nascondersi li stai proteggendo l'utente da buggy o codice non ottimale. È significativamente diverso dal codice che ritieni possa essere usato raramente . Per questo potrei considerare di usare l' EditorBrowsable
attributo per nascondere il membro dall'intellisense, anche se anche se ne sarei stanco; il cervello delle persone ha già il proprio software per filtrare ciò che non li interessa.