Добре це робити, коли член безглуздий у контексті. Наприклад, якщо ви створюєте колекцію для читання тільки, яка реалізується 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
атрибутом, щоб приховати член від інтелігенції, хоча навіть від цього я б втомлювався; мозок людей вже має власне програмне забезпечення для фільтрації того, що їх не цікавить.