我一直使用变量和赋值。现在我有一个这样的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();
}