c# - 使用 using 处理嵌套对象

标签 c# .net garbage-collection idisposable

如果我有像这样嵌套对象的代码,我是否需要使用嵌套的 using 语句来确保 SQLCommand 和 SQLConnection 对象都被正确处理,如下所示,或者如果实例化 SQLCommand 的代码我没问题在外部 using 语句中。

using (var conn = new SqlConnection(sqlConnString))
{
    using (var cmd = new SqlCommand())
    {
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = cmdTextHere;
        conn.Open();

        cmd.Connection = conn;
        rowsAffected = cmd.ExecuteNonQuery();
    }
}

最佳答案

是的。你可以像这样清理一下

using (SqlConnection conn = new SqlConnection(sqlConnString))
using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
{
   // code here
}

但您仍然希望为每个 IDisposable 对象使用 using

编辑:考虑这个使用内部 using 语句的示例。

class A : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("A Disposed");
    }
}

class B : IDisposable
{
    public void Dispose()
    {
        Console.WriteLine("B Disposed");
    }
}

代码

using (A a = new A())            
{
    B b = new B();
}

在 block 的末尾,A 被正确处理。 B怎么了?好吧,它超出了范围,只是在等待被垃圾收集。 B.Dispose() 未被调用。另一方面

using (A a = new A())
using (B b = new B())
{
}

当执行离开 block (实际上, block )时,编译代码执行对每个对象的 Dispose() 方法的调用。

关于c# - 使用 using 处理嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677652/

相关文章:

garbage-collection - 垃圾收集器如何决定何时杀死 WeakReferences 持有的对象?

c# - 操作链接(如果已授权)

c# - 在 C# 中将 Sbyte 转换为整数

c# - 来自 MemberExpression 的反射类型

.net - WCF NetTcpBinding 双工 channel 端点可以在端口 80 上吗?

c# - 在 ASP.NET 应用程序中以编程方式设置 HTTP 处理程序

.net - Azure 应用服务环境变量是否带有 "WEBSITE_"前缀?

c# - 发生压缩后GC如何更新引用

c# - Irony 中的空白终止符和 MakePlusRule

swift - Swift 中 ARC 溢出的可能性?