Подтвердить что ты не робот

С#: "Использование" выражений с HttpWebRequests/HttpWebResponses

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

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

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

Спасибо заранее.

4b9b3361

Ответ 1

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

Пример кода

var request = (HttpWebRequest)WebRequest.Create("example.com"); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Code here 
}

Ответ 2

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

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

Сиденит, так как я видел много людей, борющихся с множеством вещей, которыми нужно распоряжаться: Вместо

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

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

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

Ответ 3

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