2009-11-05 59 views
4

這兩個片段做同樣的事情 - 有一個比另一個好,還是隻是一個偏好問題?USING與聲明上下文變量是否有優勢?

Using context As MyDatabaseDataContext = New MyDatabaseDataContext() 
    Dim test = context.Employees.Count 
End Using 

Dim context As MyDatabaseDataContext = New MyDatabaseDataContext() 
Dim test = context.Employees.Count 

我知道這些都是過於簡單的例子 - 什麼是其中一個方法之一將工作比其他更好的方案是什麼?

回答

10

Using聲明結束時第一個呼叫Dispose - 這就是Using聲明的要點。它相當於Try/Finally,因此即使拋出異常也會丟棄資源。

1

第一個要求在Using塊的末尾處置。所以是的,這裏有一個優勢。

對於LINQ2SQL DataContext,你必須小心延遲執行。您不希望在Using塊中放置延遲查詢,並且Using塊會枚舉結果。您將得到關於正在處理的上下文的異常。

對WCF服務客戶端使用Using塊時,您還必須小心。您可能會遇到異常傳播問題。

1

當您使用 - 使用範圍的最後銷燬對象,而不是更晚。 如果對象有特殊的資源來處理 - 它會在早些時候釋放它們 - 所以當你使用db連接時 - 例如,使用「using」就會很聰明。

+1

對象不會被破壞。只需要調用Dispose(),這會導致對象釋放對非託管資源的引用。但對象仍然繼續存在。不過,它可能無法使用。 – Joey 2009-11-05 15:05:54

+0

它不可用。 – Dani 2009-11-05 15:08:57

+1

@Dani:這取決於決定的類型。例如,您仍然可以通過調用ToArray將數據從處理後的MemoryStream中提取出來。 – 2009-11-05 15:10:00

0

使用保證Dispose方法將在塊的結尾調用上下文,即使拋出異常。

它可支配資源的工作文件一樣,數據庫連接等

2

兩個片段不這樣做同樣的事情時是很重要的。第一個將在使用塊的末尾部署您的數據上下文,即使拋出異常也是如此。後面的代碼片段不會處理它,這可能會留下額外的數據庫連接。

3

託尼小馬的答案是確切的,使用的重點是一旦你完成對象的處理非託管資源。等效代碼:

Using context As New MyDatabaseDataContext() 
    Dim test = context.Employees.Count 
End Using 

是:

Dim context As New MyDatabaseDataContext() 
Try 
    Dim test = context.Employees.Count 
Finally 
    If context IsNot Nothing 
     context.Dispose() 
    End If 
End If