我一直使用变量和赋值。现在我有一个这样的DbProviderConnection类:

public class DbProviderConnection : IDisposable
{
    public DbConnection Connection { get; set; }
    public DbTransaction Transaction { get; set; }

    public DbTransaction BeginTransaction()
    {
        Transaction = Connection.BeginTransaction();
        return Transaction;
    }

    //... and so on
}

现在我在想像这样使用它:
using (DbProviderConnection cnctn = _planDb.CreateOpenConnection())
{
    using (cnctn.BeginTransaction())
    {
        //...
        cnctn.Transaction.Commit();
    }
}

我的问题是:DbProviderConnection.Transaction.Dispose是否被调用?

最佳答案

C# Specification 8.13使用定义为

using-statement:
   using (resource-acquisition) embedded-statement
资源获取在哪里
resource-acquisition:
    local-variable-declaration
    expression
在第一种情况下,您使用了哪种方法通过局部变量声明获取资源。在第二种情况下,资源是通过表达式获取的。因此,在第二种情况下,resouce将是cnctn.BeginTransaction()调用的结果,它是DbTransaction类中的DbProviderConnection。 using语句在使用后处置其资源。因此,是的,DbProviderConnection.Transaction.Dispose()将被调用。
更新:根据同一篇文章,您的第二个using块将被转换为
DbTransaction resource = cnctn.BeginTransaction();
try
{
    //...
    cnctn.Transaction.Commit();
}
finally
{
   if (resource != null)
      ((IDisposable)resource).Dispose();
}

08-24 16:10