在处理时,没有变量的using语句会做什么?

cha*_*r m 22 c# transactions using-statement

我一直习惯使用变量和赋值.现在我喜欢这个类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
}
Run Code Online (Sandbox Code Playgroud)

现在我想像这样使用它:

using (DbProviderConnection cnctn = _planDb.CreateOpenConnection())
{
    using (cnctn.BeginTransaction())
    {
        //...
        cnctn.Transaction.Commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:DbProviderConnection.Transaction.Dispose被叫吗?

Ser*_*kiy 20

C#Specification Specification 8.13使用语句定义为

using-statement:
   using (resource-acquisition) embedded-statement
Run Code Online (Sandbox Code Playgroud)

资源采集

resource-acquisition:
    local-variable-declaration
    expression
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,您使用通过局部变量声明获取资源.在第二种情况下,通过表达式获取资源.因此,在第二种情况下,资源将cnctn.BeginTransaction()DbTransaction来自您的DbProviderConnection班级的呼叫结果.使用语句在使用后处理其资源.所以,是的,DbProviderConnection.Transaction.Dispose()将会被召集.

更新:根据同一篇文章,您的第二个使用块将被翻译为

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


Lee*_*Lee 5

从规格:

8.13 using语句

形式的using语句

using (ResourceType resource = expression) statement
Run Code Online (Sandbox Code Playgroud)

当ResourceType是可为空的值类型或动态以外的引用类型时,扩展为

{
    ResourceType resource = expression;
    try {
        statement;
    }
    finally {
        if (resource != null) ((IDisposable)resource).Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

形式的using语句

using (expression) statement
Run Code Online (Sandbox Code Playgroud)

具有相同的三个可能的扩展...资源变量在嵌入式语句中不可访问且不可见。

因此,从该对象返回的对象cnctn.BeginTransaction()将在该块退出时被放置,但在关联的块内部不可访问。