Это хорошо, когда член бессмыслен в контексте. Например, если вы создаете коллекцию только для чтения, которая реализуется IList<T>
путем делегирования внутреннему объекту_wrapped
тогда у вас может быть что-то вроде:
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;
}
}
Здесь у нас есть четыре разных случая.
public T this[int index]
определяется нашим классом, а не интерфейсом, и, следовательно, конечно, не является явной реализацией, хотя обратите внимание, что это действительно похоже на чтение-запись T this[int index]
определенное в интерфейсе, но только для чтения.
T IList<T>.this[int index]
является явным, потому что одна его часть (получатель) идеально соответствует указанному выше свойству, а другая часть всегда будет выдавать исключение. Хотя это жизненно важно для тех, кто обращается к экземпляру этого класса через интерфейс, он не имеет смысла для тех, кто использует его через переменную типа класса.
Точно так же, потому что bool ICollection<T>.IsReadOnly
всегда собирается возвращать true, это совершенно бессмысленно для кода, который написан против типа класса, но может быть жизненно важным для этого, используя его через тип интерфейса, и поэтому мы реализуем его явно.
Наоборот, public int Count
не реализован явно, потому что потенциально может быть полезен для кого-то, использующего экземпляр через его собственный тип.
Но с вашим «очень редко используемым» случаем я бы очень сильно склонялся к тому, чтобы не использовать явную реализацию.
В тех случаях, когда я рекомендую использовать явную реализацию, вызов метода через переменную типа класса будет либо ошибкой (попытка использовать индексированный установщик), либо бессмысленной (проверка значения, которое всегда будет одним и тем же), поэтому при сокрытии их вы защищаете пользователя от ошибочного или неоптимального кода. Это существенно отличается от кода, который, по вашему мнению, редко используется. Для этого я мог бы рассмотреть возможность использования EditorBrowsable
атрибута, чтобы скрыть член от intellisense, хотя даже это было бы утомительно; У людей уже есть свое программное обеспечение для фильтрации того, что им не интересно.