В чем разница между Response.Close () и Response.Dispose ()? - PullRequest
3 голосов
/ 27 декабря 2010

С точки зрения очистки ресурса, почему существуют Response.Close() и Response.Dispose(), а какой из них более всеобъемлющий (назовите другой)?

Ответы [ 3 ]

7 голосов
/ 27 декабря 2010

Если оба метода предоставлены, реализация Dispose должна вызвать Close. Рекомендуется использовать оператор using, чтобы гарантировать, что Dispose и, следовательно, Close вызывается, даже если есть исключение.

Другими словами, сделайте это:

using (Response response = ...)
{
    // ...
}

Не это:

Response response = ...;
// ...
response.Close(); // If there is an exception this might never get called!

Одно из различий между закрытием и удалением объекта заключается в том, что при удалении объекта обычно невозможно использовать объект больше (попытка сделать это может вызвать исключение ObjectDisposedException), но после вызова Close это может быть можно по-прежнему использовать объект.

Обратите внимание, что если вы говорите о ASP.NET, то обычно вы не должны вызывать Close или Dispose для объекта Response.

1 голос
/ 27 декабря 2010

Из Руководства по проектированию для разработки библиотеки классов в Реализация Завершение и удаление для очистки неуправляемых ресурсов

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

/ Do not make this method virtual.
// A derived class should not be allowed
// to override this method.
public void Close()
{
   // Call the Dispose method with no parameters.
   Dispose();
}

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

0 голосов
/ 27 декабря 2010

Response.Close() закрывает сокетное соединение с клиентом. Response.Dispose() - это метод, который реализует интерфейс IDisposable и освобождает выделенные ресурсы.

Я думаю, Response.Close() вызывается из Response.Dispose() метода.

Для более подробной информации вы можете использовать Отражатель

...