【问题标题】:Can stacked using be combined into one using statement? [duplicate]可以将堆叠的 using 组合成一个 using 语句吗? [复制]
【发布时间】:2013-11-07 03:18:57
【问题描述】:

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

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();

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

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

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

【问题讨论】:

  • 请注意,StreamReader 的 Dispose 将释放您在构造时提供的流。因此,您无需使用流对象显式处置或包装。 stackoverflow.com/questions/1065168/…
  • 不要认为这个问题应该作为重复而关闭。使用流式阅读器的事实会产生不同的答案。

标签: c# garbage-collection dispose


【解决方案1】:

对于一般情况,您不能做出这种假设。对于您的具体情况,可以进行一些合并。特别是,释放 StreamReader 也会关闭底层流,因为 documentation for 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"))
{
    //...
}

【讨论】:

  • 我不知道堆叠。我认为要求它们是相同的类型会限制它的用处,但仍然很高兴知道。
  • 您可能不想跳过 using 语句的两个原因: 1. new StreamReader(Stream) can throw(如果 streamnull 或不支持读取),可能会使流未关闭. 2.Because Skeet says so.
  • @TimS。他确实如此,但他也承认这是一种偏好,而不是硬性规定。
【解决方案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();

【讨论】:

  • 这很好,因为stream 可能为空。
猜你喜欢
  • 2019-02-05
  • 1970-01-01
  • 2017-06-04
  • 2011-02-25
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多