c# - .NET - 用单个 using 语句替换嵌套的 using 语句

标签 c# .net nested idisposable using

如果您遇到过一些像这样的嵌套 using 语句/资源的 C# 代码:

using (var response = (HttpWebResponse)request.GetResponse())
{
    using (var responseStream = response.GetResponseStream())
    {
        using (var reader = new BinaryReader(responseStream))
        {
            // do something with reader
        }
    }
}

用这样的东西替换它安全吗?

using (var reader = new BinaryReader(((HttpWebResponse)request.GetResponse()).GetResponseStream()))
{
    // do something with reader
}

上面的例子只是一个嵌套一次性资源的例子,如有不完全正确的用法请见谅。我很好奇当您处置最外层资源(在本例中为 BinaryReader)时,它是否会递归地为您处置其子资源,或者您是否需要使用单独的 using 语句显式处置每个“层”?例如。如果处置 BinaryReader,它是否应该处置响应流,而响应流又处置响应?想想最后一句话让我觉得你确实需要单独的 using 语句,因为没有办法保证包装对象会处理内部对象。是吗?

最佳答案

您应该只堆叠您的 using 语句 - 它具有您正在寻找的预期效果:

using (var response = (HttpWebResponse)request.GetResponse())
using (var responseStream = response.GetResponseStream())
using (var reader = new BinaryReader(responseStream))
{
    // do something with reader
}

关于c# - .NET - 用单个 using 语句替换嵌套的 using 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3973553/

相关文章:

c - C 中的嵌套结构和指针

python - 使用没有值的列从 csv 创建嵌套 JSON 的问题

c# - 接口(interface)中的重载方法

c# - 实例化具有初始值的类型是否比两个单独的语句便宜?

sql-server - 如何在多个存储过程上使用事务?

c# - 如何在 Windows 时区和 IANA 时区之间进行转换?

.net - 如何阻止log4net写入两个单独的文件

c# - 存在依赖时如何设计可模拟性?

c# - System.InvalidCastException : Unable to cast object of type 'System.Double' to type 'System.Int32' in code

c# - 打破内部 foreach 循环并继续外部 foreach 循环