c# - 处置时不带变量的 using 语句有何作用?

标签 c# transactions using-statement

我一直使用 using with 变量和赋值。现在我有这样一个 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 语句定义为

using-statement:
   using (resource-acquisition) embedded-statement

资源获取在哪里

resource-acquisition:
    local-variable-declaration
    expression

在第一种情况下,您使用 which 通过局部变量声明获取资源。在第二种情况下,资源是通过表达式获取的。因此,在第二种情况下,资源将是 cnctn.BeginTransaction() 调用的结果,它是 DbProviderConnection 类中的 DbTransaction。使用语句在使用后处理其资源。所以,是的,将调用 DbProviderConnection.Transaction.Dispose()

更新:根据同一篇文章,您的第二个 using block 将被翻译成

DbTransaction resource = cnctn.BeginTransaction();
try
{
    //...
    cnctn.Transaction.Commit();
}
finally 
{
   if (resource != null) 
      ((IDisposable)resource).Dispose();
}

关于c# - 处置时不带变量的 using 语句有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988358/

相关文章:

c# - ConcurrencyMode.Multiple 和 WebOperationContext.Current 静态属性

.net - .NET 中的事务性打开/写入/替换?

c# - 在 IDisposable 对象上使用语句 - 调用 Dispose 方法的延迟

c# - .NET/C# - 使用 'using' 语句处理对象

c# - 在 using block 中间返回

c# - MVC 5/ASP.Net 4.5 安全地存储连接字符串

c# - 当从右到左为真时背景图像不显示

c# - 来自 Entity Framework 的 SqlException - 不允许新事务,因为 session 中还有其他线程在运行

c# - 从查询中检索行值到文本框

java - 我应该如何实现事务数据库EJB 3.0