Безопасно ли использовать "использование" вместо закрытия WebResponse и StreamReader
В настоящее время
Я применил простой вспомогательный метод для HttpWebRequest
, называемый GetResponse(url)
. В настоящее время я вручную закрываю WebResponse
и StreamReader
после прочтения результата. Затем я возвращаю результат следующим образом:
// construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
// get the result
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string result = reader.ReadToEnd();
// clean up and return the result
reader.Close();
response.Close();
return result;
Предлагаемые
Безопасно ли включать возврат в выражения using
вместо их закрытия; будет ли это иметь тот же эффект, что и .Close()
es?
// construct the request
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
// get the result
using (WebResponse response = request.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
return reader.ReadToEnd();
}
}
Ответы
Ответ 1
Это не только безопасно - это безопаснее, чем оригинал, поскольку он будет уничтожать объекты, даже если выбрано исключение; Оператор using
эквивалентен оператору try
/finally
.
В общем случае всякий раз, когда вы пишете вызов Close()
или Dispose()
явно, рассмотрите, можно ли использовать оператор using
.
(Обратите внимание, что вы не используете кодировку из веб-ответа, кстати, вы всегда предполагаете UTF-8. Вместо этого использование WebClient
может сделать это проще, если это вариант.)
Ответ 2
using (StreamReader reader = new StreamReader())
{
// code
}
совпадает с
StreamReader reader;
try
{
reader = new StreamReader();
// code
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
Итак, это почти то же самое, что и ваш код, но безопаснее из-за блока try/finally.
Ответ 3
Я бы предложил сделать это:
string ret = string.Empty;
using (WebResponse response = request.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
ret = reader.ReadToEnd();
}
}
return ret;
безопасно использовать "использование", он будет удалять WebResponse и StreamReader, но он не гарантирует, что он запустит возврат.