我一直使用 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/