Il est bon de le faire lorsque le député est inutile dans son contexte. Par exemple, si vous créez une collection en lecture seule qui implémente IList<T>
en déléguant à un objet interne, _wrapped
vous pouvez avoir quelque chose comme:
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;
}
}
Ici, nous avons quatre cas différents.
public T this[int index]
est défini par notre classe plutôt que par l'interface, et n'est donc bien sûr pas une implémentation explicite, bien que cela se trouve être similaire à la lecture-écriture T this[int index]
définie dans l'interface mais est en lecture seule.
T IList<T>.this[int index]
est explicite car une partie de celui-ci (le getter) est parfaitement mise en correspondance par la propriété ci-dessus, et l'autre partie lèvera toujours une exception. Bien que vital pour quelqu'un accédant à une instance de cette classe via l'interface, il est inutile pour quelqu'un de l'utiliser via une variable du type de la classe.
De même, parce que bool ICollection<T>.IsReadOnly
va toujours retourner vrai, il est tout à fait inutile de code écrit contre le type de la classe, mais pourrait être vital pour celui qui l'utilise via le type de l'interface, et donc nous l'implémentons explicitement.
Inversement, public int Count
n'est pas implémenté explicitement car il pourrait potentiellement être utile à quelqu'un utilisant une instance via son propre type.
Mais avec votre cas "très rarement utilisé", je pencherais très fortement pour ne pas utiliser une implémentation explicite.
Dans les cas où je recommande d'utiliser une implémentation explicite appelant la méthode via une variable du type de la classe, ce serait soit une erreur (essayer d'utiliser le setter indexé) soit inutile (vérifier une valeur qui sera toujours la même) donc en se cachant vous protégez l'utilisateur du buggy ou du code sous-optimal. C'est très différent du code qui, selon vous, est susceptible d'être rarement utilisé. Pour cela, je pourrais envisager d'utiliser l' EditorBrowsable
attribut pour cacher le membre d'intellisense, même si je serais fatigué de; le cerveau des gens a déjà son propre logiciel pour filtrer ce qui ne les intéresse pas.