Почему класс реализовал бы IDisposable явно вместо неявно?

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

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

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

17
задан Community 23 May 2017 в 12:00
поделиться

4 ответа

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

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

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

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

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

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

.
15
ответ дан 30 November 2019 в 13:33
поделиться
  • Иногда класс имеет метод Dispose, который является частью интерфейса, но на самом деле его не нужно вызывать, потому что единственным ресурсом, который нужно утилизировать, является память: MemoryStream, например.
  • Как упоминалось другими, если класс имеет метод Close, который делает то же самое, что и Dispose, возможно, Dispose должен существовать только для поддержки паттерна "использования", поэтому он может быть явным.
5
ответ дан 30 November 2019 в 13:33
поделиться

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

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

1
ответ дан 30 November 2019 в 13:33
поделиться

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

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

Чем это:

var response = GetResponse();

// do something

((IDisposable)response).Dispose();

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

1
ответ дан 30 November 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: