Почему класс реализует IDisposable явно, а не неявно? - PullRequest
17 голосов
/ 25 июня 2010

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

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

Почему разработчик такого класса, как этот, решил явно реализовать IDisposable? * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [*].

Ответы [ 4 ]

15 голосов
/ 25 июня 2010

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

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

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

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

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

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

5 голосов
/ 25 июня 2010
  • Иногда класс имеет метод Dispose, который является частью интерфейса, но на самом деле его не нужно вызывать, потому что единственный ресурс, которым можно распоряжаться, - это память: например, MemoryStream.
  • Как уже упоминалось другими, если в классе есть метод Close, который делает то же самое, что и Dispose, возможно, Dispose должен существовать только для поддержки шаблона "using", поэтому он также может быть явным.
1 голос
/ 25 июня 2010

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

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

Чем это:

var response = GetResponse();

// do something

((IDisposable)response).Dispose();

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

1 голос
/ 25 июня 2010

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

...