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

我一直习惯使用变量和赋值。 现在我喜欢这个类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 Specification 8.13使用语句定义为

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

资源获取的地方

 resource-acquisition: local-variable-declaration expression 

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

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

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

从规格:

8.13使用声明

表格的使用声明

 using (ResourceType resource = expression) statement 

当ResourceType是可以为null的值类型或除dynamic之外的引用类型时,扩展为

 { ResourceType resource = expression; try { statement; } finally { if (resource != null) ((IDisposable)resource).Dispose(); } } 

表格的使用声明

 using (expression) statement 

具有相同的三种可能的扩展…资源变量在嵌入语句中是不可访问的,并且是不可访问的。

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

是的,将调用Dispose。 using语句仅适用于一次性对象。 像这样:

 using (DbProviderConnection cnctn = _planDb.CreateOpenConnection()) { using (cnctn.BeginTransaction()) { // ... cnctn.Transaction.Commit(); } // Here BeginTransaction.Dispose() is called. } // Here DbProviderConnection.Dispose() is called. 

BeginTransaction返回的对象将被处理。

BeginTransaction返回一个DbTransaction这样就会被处理掉