17

目前

HttpWebRequest我已经为被调用实现了一个简单的辅助方法GetResponse(url)。目前我在阅读结果后手动关闭WebResponseand 。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;

建议的

在语句中包含返回而不是关闭它们是否安全?这会和esusing有同样的效果吗?.Close()

// 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();
    }
}
4

3 回答 3

25

这不仅安全——它比原来的更安全,因为即使抛出异常,它也会处理对象;using语句等同于/try语句finally

通常,无论何时显式编写Close()orDispose()调用时,请考虑是否可以改用using语句。

(请注意,顺便说一下,您没有使用来自 Web 响应的编码 - 您总是假设为 UTF-8。如果WebClient可以选择,使用它可以使这更简单。)

于 2012-10-12T14:18:05.443 回答
1
using (StreamReader reader = new StreamReader())
{
    // code
}

是相同的

StreamReader reader;
try
{
    reader = new StreamReader();
    // code
}
finally
{
    if (reader != null)
    {
        reader.Dispose();
    }
}

因此它与您的代码几乎相同,但由于 try/finally 块而更安全。

于 2012-10-12T14:20:35.683 回答
1

我建议这样做:

    string ret = string.Empty;
    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            ret = reader.ReadToEnd();
        }
    }
    return ret;

使用“使用”是安全的,它会处理 WebResponse 和 StreamReader,但不保证它会运行返回。

于 2012-10-12T14:26:34.497 回答