É uma boa forma de fazê-lo quando o membro não faz sentido no contexto. Por exemplo, se você criar uma coleção somente leitura implementada IList<T>
delegando a um objeto interno _wrapped
, poderá ter 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;
}
}
Aqui temos quatro casos diferentes.
public T this[int index]
é definido por nossa classe e não pela interface e, portanto, obviamente não é uma implementação explícita, embora observe que é semelhante à leitura-gravação T this[int index]
definida na interface, mas é somente leitura.
T IList<T>.this[int index]
é explícito porque uma parte (o getter) corresponde perfeitamente à propriedade acima e a outra parte sempre gera uma exceção. Embora seja vital para alguém acessar uma instância desta classe por meio da interface, não faz sentido alguém usá-la através de uma variável do tipo da classe.
Da mesma forma, porque bool ICollection<T>.IsReadOnly
sempre retornará true, é totalmente inútil o código escrito contra o tipo da classe, mas pode ser vital para usá-lo através do tipo da interface e, portanto, nós o implementamos explicitamente.
Por outro lado, public int Count
não é implementado explicitamente porque poderia ser útil para alguém que usa uma instância por meio de seu próprio tipo.
Mas com o seu caso "muito raramente usado", eu me inclinaria muito fortemente para não usar uma implementação explícita.
Nos casos em que eu recomendo usar uma implementação explícita, chamar o método por meio de uma variável do tipo da classe seria um erro (tentando usar o setter indexado) ou inútil (verificar um valor que sempre será o mesmo) para ocultar você está protegendo o usuário de código incorreto ou subótimo. Isso é significativamente diferente do código que você acha que provavelmente será usado raramente . Por isso, eu poderia considerar usar o EditorBrowsable
atributo para ocultar o membro do intellisense, embora eu estivesse cansado disso; o cérebro das pessoas já tem seu próprio software para filtrar o que não lhes interessa.