2009-12-29 20 views
6

我正在開發一個.NET項目,它需要與一些用戶定義的類進行交互 - 被改爲「作業」。所有工作類別必須實現特定的接口IJob,以便庫消耗它們。有時候一個工作類可能擁有非託管資源,這需要明確處理。我應該如何確保處理可能的一次性物品?

我應該如何確保所有工作在使用後妥善處理,如果我事先不知道工作是否需要明確處置?我有幾個想法我自己,而是想聽聽您的意見/建議:

  1. IJob : IDisposable,迫使所有的工作來實現Dispose()方法。這將允許我在using塊中處理工作,但由於大多數工作是而不是預計需要明確處置,這可能會增加客戶開發人員不必要的困惑。

  2. 是否涉及作業的所有工作try-finally塊,並用finally,以確保如果作業實現IDisposableDispose()被調用。這使得客戶更容易實施新的工作職位 - 不必實施空的方法 - 但它也隱藏了圖書館知道並關心一次性工作的事實。

寫這篇後,我趨向於向解決方案#1瘦,但我仍然認爲這將是很好看的替代解決方案,以及額外的優點/缺點兩個我心中已經有了。

回答

8

同意有一個先例:數據流的基類是IDisposable的NAD因此所有流後裔。但是MemoryStream不需要Disposing。
但是,不要試圖/最後,using() { }塊是一個更方便的速記。

所以你的選擇是:你想要所有的工作都是IDisposable或只是一些?

第一個選項會產生小的開銷,第二個選項會讓您更容易忘記在必要時處置(使用)。

+0

好點。但是,大部分流都需要處理,我希望只有少數工作需要處理。 – 2009-12-29 17:51:25

+0

在我看來'System.Web.IHttpModule'也需要它的實現者提供'Dispose()'方法,儘管只有少數模塊(恕我直言)需要它。我想這爲#1提供了額外的優先權。 – 2009-12-29 17:54:50

+1

+1,我認爲,爲Job提供一個標準化的方法來清理它使用的是合理的。通過使用'IDisposable',您可以從框架支持中受益,並且最終用戶至少可以考慮在何處放置適當的清理代碼。 – user7116 2009-12-29 18:00:14

2

我會去#2和文件,任何一次性物品將被丟棄。基本上,如果你擁有一個對象的所有權,你有義務處理實現IDisposable的對象。

如果你讀過有效的C#/更有效的C#,比爾·瓦格納給出相同的建議(我有明顯;-)

+0

的OP已經在配置這兩個選項所擁有的對象,所以我看不出這是一個選項#2的參數。 – 2009-12-30 13:10:45

3

我覺得這樣。我寧願開發人員實施一個空的Dispose方法,而忘記實施必要的方法Dispose

5

#2是如何構造foreach的作品。 Autofac的容器處理工作也是如此。

語義差別是你是否說工作本身一次性的,或實施是否可能一次性的。

從你的例子中可以清楚地看出,前者不是真實的,即工作本身不是一次性的。因此,我建議#2,但有一個擴展方法集中在try/finally

public static void Execute(this IJob job) 
{ 
    try 
    { 
     job.Run(); 
    } 
    finally 
    { 
     var disposableJob = job as IDisposable; 

     if(disposableJob != null) 
     { 
      disposableJob.Dispose(); 
     } 
    } 
} 
+0

+1,我喜歡你關於語義的觀點,但是我想我會用第一種解決方案,因爲其他答案中提到的原因和問題本身。 – 2009-12-29 20:24:45