Безопасно ли использовать "использование" вместо закрытия WebResponse и StreamReader - программирование
Подтвердить что ты не робот

Безопасно ли использовать "использование" вместо закрытия 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();
    }
}
4b9b3361

Ответ 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, но он не гарантирует, что он запустит возврат.