0

我有一个返回如下的方法:

using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
    return reader.ReadToEnd();

我可以像这样将三种用途结合起来并具有相同的安全级别吗?

using (var reader = new StreamReader(request.GetResponse().GetResponseStream()))
    return reader.ReadToEnd();

或者因为这是一个私有作用域的函数,我可以在不使用的情况下安全返回吗?

return new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();

包含此方法的对象不是IDisposable。我猜我的两个问题都没有,但我对其他观点很好奇。

4

2 回答 2

4

对于一般情况,您不能做出这种假设。对于您的具体情况,可以进行一些合并。特别是,处理 StreamReader 也将关闭底层流,因为文档StreamReader.Close()做出了这样的保证:

关闭 StreamReader 对象和底层流

(强调我的)。因此,您可以使用示例中的块跳过中间。但是,从 Stream 到 HttpResponse 对象并没有做出同样的保证,这意味着您仍然希望保留它。所以你可以这样做:

using (var response = request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
    return reader.ReadToEnd();

此外,还有另一种情况,您可以将堆叠using的块组合成一个块。当 using 块管理的所有项目都属于同一类型时,您可以用逗号分隔每个对象。例如,打开一个文件以读取和处理另一个文件的输出可以这样完成:

using (var infile = new FileStream("infile"), outfile = new FileStream("outfile"))
{
    //...
}
于 2013-11-06T18:00:54.607 回答
2

通常,您需要单独的语句来确保正确清理所有内容:

using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
    return reader.ReadToEnd();

否则,中途出现的错误可能会使资源无法处理。例如,如果GetResponseStream()在这段代码中抛出异常,你最终会得到一个未处理的响应:

using (var reader = new StreamReader(request.GetResponse().GetResponseStream()))
    return reader.ReadToEnd();
于 2013-11-06T17:59:06.307 回答