是否有必要使用IDisposable对象嵌套使用?

我是否必须将所有IDisposable对象包装在using(){}语句中,即使我只是将它们传递给另一个? 例如,在以下方法中:

 public static string ReadResponse(HttpWebResponse response) { string resp = null; using (Stream responseStream = response.GetResponseStream()) { using (StreamReader responseReader = new StreamReader(responseStream)) { resp = responseReader.ReadToEnd(); } } return resp; } 

我可以using这样的方法将其合并到一个:

 public static string ReadResponse(HttpWebResponse response) { string resp = null; using (StreamReader reader = new StreamReader(response.GetResponseStream())) { resp = reader.ReadToEnd(); } return resp; } 

我可以依靠StreamStreamReader进行处置吗? 或者我必须使用两个using语句?

是的,你可以 ,但那是因为StreamReader构造函数文档特别说:“当调用StreamReader.Dispose时,StreamReader对象在提供的Stream对象上调用Dispose。”

如果没有,那么你可以做这样的事情来至少清理一下代码。

 using (Stream responseStream = response.GetResponseStream()) using (StreamReader responseReader = new StreamReader(responseStream)) { resp = responseReader.ReadToEnd(); } 

创建一次性对象的人/代码/层通常应该负责处理对象。 但是,有些情况可能会出现这种情况并非如此。 它成为文档的问题。

我发现这个问题比using语句嵌套的简单问题更广泛,这是一个非常有趣的应用程序设计问题。

我是否必须将所有IDisposable对象包装在using(){}语句中,即使我只是将它们传递给另一个?

是的,因为您正在实例化实现IDisposable对象 – 您知道通过包装using()或显式Dispose()调用来处置它。

这背后的原因很简单,想象下一个场景:你有以下实体

  • TransportService
  • ReportService的
  • FeedService

所有实现IDisposableReportServiceFeedService需要在构建阶段传递TransportService实例。 问题 – 在ReportService或FeedService的Dispose()中处理TransportService是否正确? 没有! 因为可以在两个服务中传递相同的传输服务实例,并且一旦传输一个传输 – 这也将影响所有服务。

 public sealed class ReportService : IDisposable { private readonly ITransportService transportService; public ReportService(ITransportService transportService) { this.transportService = transportService; } public Dispose() { // ReportService should not dispose objects // passed in since they could be used by other classes as well // DO NOT: transportService.Dispose(); } }