2009-01-20 65 views
3

我已經看到獲取和處理資源的兩種方式。或者:初始化外部或內部的可支配資源try/finally

Resource resource = getResource(); 
try { /* do something with resource */ } 
finally { resource.close(); } 

或:

Resource resource = null; 
try { resource = getResource(); /* do something with resource */ } 
finally { if (resource != null) resource.close(); } 

我想知道哪一種風格是優選的。第一個避免if條件,而第二個(我假設)在分配後但在輸入try塊之前處理線程中止的情況。這些風格有哪些其他優缺點?我最好使用哪一個?

回答

4

在C#中,只需要使用using語句:

using (Resource resource = GetResource()) 
{ 
    /* Do something */ 
} 

有沒有一個線程的風險中止在分配之間的Java發生,在進入try塊 - 將中止睡覺,等待過程中才會發生。編輯:我真的不能在規範中找到這個,這有點令人擔憂。嗯。

+0

謝謝。 C#使用關鍵字很好,但有時它不能被使用(例如,使用不實現IDisposable的類型,或者當應該有條件地調用Dispose()時)。至於Java,我對這些問題沒有經驗,但是不能中斷一個線程? – 2009-01-20 21:20:40

-1

如果的getResource()拋出一個異常,那麼資源將是無效的,的getResource()不例外的情況下返回任何東西。所以,只要 getResource()可以拋出異常,在調用 resource.close()之前,總是檢查null。我覺得組織這段代碼的最好方法是將所有內容放在try塊中;清楚地說明 getResource()會拋出異常。

+1

雖然沒有必要使用第一個版本來完成此操作 - 如果引發異常,您將無法到達finally塊。 – 2009-01-20 20:59:15

+0

在類似的代碼中,比如說正在獲取並釋放鎖,收購失敗將導致無法匹敵的版本。 – 2009-01-20 23:51:55