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

gil*_*ly3 11 c#

我是否必须将所有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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我能指望被处置者StreamStreamReader被处置者吗?或者我必须使用两个using陈述?

Ser*_*rvy 12

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

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

using (Stream responseStream = response.GetResponseStream())
using (StreamReader responseReader = new StreamReader(responseStream))
{
    resp = responseReader.ReadToEnd();
}
Run Code Online (Sandbox Code Playgroud)