2012-09-03 78 views
8

如果我有一個圍繞try catch語句的使用塊,該catch語句應該引發異常,那麼使用語句中的對象會發生什麼?請看下面的代碼:使用帶try try的語句。使用語句的實例會發生什麼?

using (IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse()) 
{ 
    try 
    { 
     Foo(); 
    } 
    catch (ArgumentNullException e) 
    { 
     throw; 
    } 
} 

如果我們假設美孚()失敗和異常被觸發,有效地打破該方案將databaseConnectivityObject處置?這很重要的原因是對象有一個與之關聯的數據庫連接。

回答

9

您可以將using視爲試用版的簡寫。因此,你的代碼就相當於:

IDatabaseConnectivityObject databaseConnectivityObject = new DbProviderFactoryConnectionBasicResponse(); 
try 
{ 
    try 
    { 
     Foo(); 
    } 
    catch(ArgumentNullException e) 
    { 
     throw; 
    } 
} 
finally 
{ 
    if(databaseConnectivityObject != null)//this test is often optimised away 
    databaseConnectivityObject.Dispose() 
} 

在這樣來看,你可以看到Dispose()的確會如果異常拋出,調用,因爲在try-最後是在try-catch之外。

這正是我們使用using的原因。

+0

的鏈接中看到更詳細的例子,謝謝喬恩。你的代碼示例非常清楚。 – CSharpened

7

我們假設美孚()失敗和異常被觸發,有效 中斷程序將databaseConnectivityObject處置?

是的,它會。使用內部使用try-finally(使用只適用於那些實現IDisposable

MSDN- using statement

using語句確保即使 發生異常當你調用方法是調用Dispose 在物體上。你可以通過將對象放在一個try塊中並且然後在finally塊中調用Dispose來實現相同的結果;然後你可以通過 來獲得相同的結果。實際上,這是編譯器如何翻譯 使用語句。 catch塊 -

+0

因此,實際上使用嘗試使用塊中的所有代碼,並最終在finally塊中調用MyObject.Dispose(),我們沒有看到? – CSharpened

+1

@C磨合,絕對正確,就是這樣。你可以在答案 – Habib

3

是的,你是否有一個嘗試的using塊將處置databaseConnectivityObject的,不論。

您正確地說使用塊很重要,您應該將它用於實現IDisposable的所有類,以確保它們即使在發生異常時也能正確處置。

MSDN- using statement

using語句確保即使 發生異常,而你是調用對象的方法是調用Dispose 。你可以通過將對象放在一個try塊中並且然後在finally塊中調用Dispose來實現相同的結果;然後你可以通過 來獲得相同的結果。實際上,這是編譯器如何翻譯 使用語句。

2

using代碼相當於

IDatabaseConnectivityObject databaseConnectivityObject = new IDatabaseConnectivityObject(); 
try 
{ 
//To do code here 
} 
finally 
{ 
    if(databaseConnectivityObject!=null) 
    { 
     databaseConnectivityObject.Dispose(); 
    } 
} 

using語句主要分爲三個部分組成,即

  1. 採集
  2. 使用
  3. 處置

首先,獲取資源並在try塊上使用finally語句。最後,將對象放置在finally塊中,如上面的等價代碼所示...。

+1

我認爲值得指出的是,空測試在解釋時通常會進行優化。有人可能會試圖做他們自己的嘗試 - 最後作爲微觀優化。無論如何,這將是一個壞主意(可讀性的降低不值得),但它甚至不會提供他們認爲可能的微小利益,這將進一步阻止它。 –