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)
从规格:
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()将在该块退出时被放置,但在关联的块内部不可访问。
| 归档时间: |
|
| 查看次数: |
4933 次 |
| 最近记录: |