Es una buena forma de hacerlo cuando el miembro no tiene sentido en su contexto. Por ejemplo, si crea una colección de solo lectura que se implementa IList<T>
delegando a un objeto interno, _wrapped
entonces podría tener algo como:
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;
}
}
Aquí tenemos cuatro casos diferentes.
public T this[int index]
está definido por nuestra clase en lugar de la interfaz y, por lo tanto, no es una implementación explícita, aunque tenga en cuenta que es similar a la lectura-escritura T this[int index]
definida en la interfaz, pero es de solo lectura.
T IList<T>.this[int index]
es explícito porque una parte de él (el captador) coincide perfectamente con la propiedad anterior, y la otra parte siempre arrojará una excepción. Si bien es vital para alguien que accede a una instancia de esta clase a través de la interfaz, no tiene sentido que alguien la use a través de una variable del tipo de la clase.
De manera similar, dado bool ICollection<T>.IsReadOnly
que siempre va a devolver verdadero, no tiene sentido codificar el código escrito en contra del tipo de la clase, pero podría ser vital para usarlo a través del tipo de interfaz y, por lo tanto, lo implementamos explícitamente.
Por el contrario, public int Count
no se implementa explícitamente porque podría ser útil para alguien que usa una instancia a través de su propio tipo.
Pero con su caso de "uso muy poco frecuente", me inclinaría mucho por no utilizar una implementación explícita.
En los casos en los que recomiendo usar una implementación explícita que llame al método a través de una variable del tipo de la clase, podría ser un error (intentar usar el setter indexado) o no tener sentido (verificar un valor que siempre será el mismo) para ocultar si está protegiendo al usuario del código defectuoso o subóptimo. Eso es significativamente diferente al código que crees que es probable que rara vez se use. Para eso, podría considerar usar el EditorBrowsable
atributo para ocultar el miembro de intellisense, aunque incluso eso me cansaría; los cerebros de las personas ya tienen su propio software para filtrar lo que no les interesa.