C#: “Использование” операторов с HttpWebRequests/HttpWebResponses

Jon Skeet сделал комментарий (через Twitter) на моем коде SOApiDotNet (библиотека.NET для предальфа-API Переполнения стека):

@maximz2005 Одна вещь я заметил только от просмотра источника быстро: Вы не делаете расположенный (натравливают) WebResponses. "использование" операторов FTW.

Он указывает, что я должен обернуть эти веб-сессии в "использование" операторов. Однако у меня есть вопрос об этом: я должен обернуть все это, начиная с HttpWebRequest, или я должен создать WebRequest за пределами оператора "использования" и затем обернуть Ответ внутри? У меня есть чувство, что различие - то, что в первом от обоих объектов избавились бы - это корректно?

Заранее спасибо.

21
задан Maxim Zaslavsky 28 December 2009 в 08:19
поделиться

3 ответа

HttpWebRequest сам по себе не является одноразовым, в отличие от HttpWebResponse. Вы должны завернуть одноразовые ресурсы с использованием, чтобы позволить раннее и определенное очищение. Правильно реализованный паттерн IDisposable позволяет многократные вызовы Dispose безо всяких проблем, поэтому даже внешнее использование оператора обёртывает ресурс, который во время своей собственной утилизации располагает внутренним использованием оператора-ресурса, всё равно нормально.

Пример кода

var request = (HttpWebRequest)WebRequest.Create("example.com"); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Code here 
}
47
ответ дан 29 November 2019 в 06:51
поделиться

Всё, что завернуто в блок use () {} (то есть внутри первых скобок), располагается, когда вы выходите из области видимости.

Пока я не использовал вашу библиотеку (вроде бы хорошо), но я бы сказал, что вы должны явно располагать все IDisposable, которые вы создаёте (= ответственны за) и не возвращаться к вызывающему абоненту.

Боковая заметка, так как я видел много людей, которые боролись с множеством вещей, чтобы распорядиться: вместо

using (var foo = SomeIDisposable) {
  using (var bar = SomeOtherIDisposable) {
  }
}

, которой нужно много вертикального пространства, вы можете написать

using (var foo = SomeIDisposable)
using (var bar = SomeOtherIDisposable) {
}
6
ответ дан 29 November 2019 в 06:51
поделиться

Для предотвращения утечки памяти необходимо вызывать Dispose на каждом объекте, реализующем IDisposable. Вы можете убедиться, что метод Dispose в вызываемом объекте использует ключевое слово using (не pun), так как это просто синтаксический сахар для try-finally block.

.
1
ответ дан 29 November 2019 в 06:51
поделиться
Другие вопросы по тегам:

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