Jon Skeet сделал комментарий (через Twitter) на моем коде SOApiDotNet (библиотека.NET для предальфа-API Переполнения стека):
@maximz2005 Одна вещь я заметил только от просмотра источника быстро: Вы не делаете расположенный (натравливают) WebResponses. "использование" операторов FTW.
Он указывает, что я должен обернуть эти веб-сессии в "использование" операторов. Однако у меня есть вопрос об этом: я должен обернуть все это, начиная с HttpWebRequest, или я должен создать WebRequest за пределами оператора "использования" и затем обернуть Ответ внутри? У меня есть чувство, что различие - то, что в первом от обоих объектов избавились бы - это корректно?
Заранее спасибо.
HttpWebRequest
сам по себе не является одноразовым, в отличие от HttpWebResponse
. Вы должны завернуть одноразовые ресурсы с использованием, чтобы позволить раннее и определенное очищение. Правильно реализованный паттерн IDisposable
позволяет многократные вызовы Dispose
безо всяких проблем, поэтому даже внешнее использование оператора обёртывает ресурс, который во время своей собственной утилизации располагает внутренним использованием оператора-ресурса, всё равно нормально.
Пример кода
var request = (HttpWebRequest)WebRequest.Create("example.com");
using (var response = (HttpWebResponse)request.GetResponse())
{
// Code here
}
Всё, что завернуто в блок use () {} (то есть внутри первых скобок), располагается, когда вы выходите из области видимости.
Пока я не использовал вашу библиотеку (вроде бы хорошо), но я бы сказал, что вы должны явно располагать все IDisposable, которые вы создаёте (= ответственны за) и не возвращаться к вызывающему абоненту.
Боковая заметка, так как я видел много людей, которые боролись с множеством вещей, чтобы распорядиться: вместо
using (var foo = SomeIDisposable) {
using (var bar = SomeOtherIDisposable) {
}
}
, которой нужно много вертикального пространства, вы можете написать
using (var foo = SomeIDisposable)
using (var bar = SomeOtherIDisposable) {
}
Для предотвращения утечки памяти необходимо вызывать Dispose на каждом объекте, реализующем IDisposable. Вы можете убедиться, что метод Dispose в вызываемом объекте использует ключевое слово using (не pun), так как это просто синтаксический сахар для try-finally block.
.