Почему class должен реализовать IDisposable явно, а не неявно?

Я использовал class FtpWebResponse и не видел метод Dispose. Оказывается, class реализует IDisposable, но делает это явно, чтобы вы сначала перенесли свой экземпляр в IDisposable перед вызовом Dispose:

// response is an instance of FtpWebResposne ((IDisposable) response).Dispose(); 

Почему разработчик такого classа, как этот, должен явно реализовать IDisposable? Как говорит Энтони Пегем , выполнение подобных действий маскирует тот факт, что объект должен быть утилизирован для среднего разработчика, который не обращается к документации каждый раз, когда он / она использует class.

Обычно это делается, если class имеет метод Close который является таким же, как Dispose . Исходный Dispose скрыт в явной реализации, так что тот же самый метод не имеет двух имен.

Это официально рекомендуется здесь:

Внесите метод Close для целей очистки, если такая терминология является стандартной, например, как с файлом или сокетом. При этом рекомендуется, чтобы реализация Close была идентичной Dispose …

Рассмотрите возможность использования элементов интерфейса явно, чтобы скрыть элемент и добавить эквивалентный элемент с лучшим именем.

Иногда доменное имя более подходит, чем Dispose. Например, инкапсуляция файла может захотеть использовать имя метода Close. В этом случае реализуйте Dispose конфиденциально и создайте общеansible метод Close, который вызывает Dispose.

(PS Я не согласен с этим соглашением).

  • Иногда class будет иметь метод Dispose, который является частью интерфейса, но на самом деле его не нужно вызывать, потому что единственным ресурсом, которым нужно распоряжаться, является память: MemoryStream, например.
  • Как упоминалось другими, если class имеет метод Close, который делает то же самое, что и Dispose, возможно, Dispose должен существовать только для поддержки шаблона «using», чтобы он мог быть явным.

Это немного странно и для меня. Для чего это стоит: базовый class (WebResponse) реализует метод Close (). Отражатель показывает, что метод Dispose () WebResponse просто вызывает Close () и виртуальный виртуальный виртуальный OnDispose, который ничего не делает.

Я должен признаться, что он немного пахнет мне, но я уверен, что они явно реализовали IDisposable, чтобы не было путаницы в Intellisense между вызовом Close () или Dispose ().

В дополнение к тому, что было сказано, я могу предположить, что реализация IDisposable явно поощряет использование блока using , поскольку его можно использовать для любого типа, который реализует IDisposable и более естественно (для большинства людей) в любом случае написать это:

 using (var response = GetResponse()) { // do something } 

Чем это:

 var response = GetResponse(); // do something ((IDisposable)response).Dispose(); 

Я не уверен, что это было бы намерение разработчика в явной реализации IDisposable , но это возможно.

Давайте будем гением компьютера.