Я использовал класс FtpWebResponse и не видел Расположить метод. Оказывается, что класс реализует IDisposable, но делает так явно так, чтобы Вы сначала бросили свой экземпляр к IDisposable, прежде чем вызов Расположит:
// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();
Почему был бы, разработчик класса, такого как этот принимает решение реализовать IDisposable явно? Как Anthony Pegram говорит, делая вещи, этот путь маскирует то, что объект должен быть расположен для среднего разработчика, который не консультируется с документацией каждый раз, когда он использует класс.
Обычно это делается, если у класса есть метод Close
, который точно такой же, как Dispose
. Оригинальный Dispose
скрывается в явной реализации, чтобы точно такой же метод не имел двух имен.
Здесь официально рекомендуется:
(P.S. Я не согласен с этим соглашением.)
.Мне тоже это немного странно. Для чего это стоит: базовый класс (WebResponse) реализует метод Close (). Reflector показывает, что метод 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
, но это возможно.