是否有必要使用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; }
我可以依靠Stream
和StreamReader
进行处置吗? 或者我必须使用两个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
所有实现IDisposable
。 ReportService
和FeedService
需要在构建阶段传递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(); } }