問題描述
我一直使用 with 變量和賦值.現在我有這樣一個 DbProviderConnection 類:
I've always used using with variable and assignment. Now i have like this a class 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
}
現在我想像這樣使用它:
Now i was thinkin to use it like this:
using (DbProviderConnection cnctn = _planDb.CreateOpenConnection())
{
using (cnctn.BeginTransaction())
{
//...
cnctn.Transaction.Commit();
}
}
我的問題是:DbProviderConnection.Transaction.Dispose
被調用了嗎?
My question is: Is the DbProviderConnection.Transaction.Dispose
called?
推薦答案
來自 C# 規范 8.13 using 定義為
From C# Specification 8.13 using statement defined as
using-statement:
using (resource-acquisition) embedded-statement
資源獲取在哪里
resource-acquisition:
local-variable-declaration
expression
在第一種情況下,您使用 which 通過局部變量聲明獲取資源.在第二種情況下,資源是通過表達式獲取的.因此,在第二種情況下,資源將是 cnctn.BeginTransaction()
調用的結果,它是來自您的 DbProviderConnection
類的 DbTransaction
.using 語句在使用后處理其資源.所以,是的,DbProviderConnection.Transaction.Dispose()
將被調用.
In first case you have using which acquires resource via local variable declaration. In second case resource is acquired via expression. So, in second case resouce will be result of cnctn.BeginTransaction()
call, which is DbTransaction
from your DbProviderConnection
class. Using statement disposes its resource after usage. So, yes, DbProviderConnection.Transaction.Dispose()
will be called.
更新:根據同一篇文章,您的第二個 using 塊將被翻譯為
UPDATE: According to same article, your second using block will be translated to
DbTransaction resource = cnctn.BeginTransaction();
try
{
//...
cnctn.Transaction.Commit();
}
finally
{
if (resource != null)
((IDisposable)resource).Dispose();
}
這篇關于處理時不帶變量的 using 語句有什么作用?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!