Sto lavorando a un progetto .NET, che deve interagire con alcune classi definite dall'utente, denominate "lavori". Tutte le classi di lavoro devono implementare un'interfaccia specifica IJob
nell'ordine in cui la libreria può consumarle. A volte una classe di lavoro può contenere risorse non gestite, che devono essere disposte esplicitamente.Come dovrei garantire lo smaltimento di eventuali oggetti monouso?
In che modo è necessario garantire che tutti i lavori siano correttamente smaltiti dopo l'uso, se non si conosce in anticipo se il lavoro richiede uno smaltimento esplicito? Ho un paio di idee me stesso, ma vorrei sentire i vostri commenti/suggerimenti:
Fai
IJob : IDisposable
, costringendo tutti i lavori per implementare un metodoDispose()
. Ciò mi consentirà di lavorare con i lavori nei blocchiusing
, ma poiché la maggior parte dei lavori è non che si prevede abbia bisogno di smaltimento esplicito, ciò potrebbe aggiungere confusione non necessaria per gli sviluppatori client.fare tutto il lavoro che coinvolge posti di lavoro in
try-finally
blocchi, e utilizzarefinally
per garantire cheDispose()
si chiama se il lavoro implementaIDisposable
. Ciò rende più semplice per i clienti implementare una nuova classe di lavoro - non dovendo implementare un metodo vuotoDispose()
- ma nasconde anche il fatto che la libreria conosce e si preoccupa dei lavori usa e getta.
Dopo aver scritto questo, ho tendono a inclinarsi verso la soluzione # 1, ma io continuo a pensare che sarebbe stato bello vedere soluzioni alternative, e pro supplementari/svantaggi di due ho già in mente.
Buon punto. Tuttavia, la maggior parte dei flussi avrà bisogno di smaltimento, e mi aspetto che solo una minoranza di posti di lavoro ne abbia bisogno. –
Mi viene in mente che 'System.Web.IHttpModule' richiede anche ai suoi implementatori di fornire un metodo' Dispose() ', anche se solo pochi moduli (IMHO) ne hanno bisogno. Immagino che questo preveda un'ulteriore precedenza per il # 1. –
+1, penso inoltre che abbia senso fornire un metodo standardizzato per un lavoro per ripulire ciò che ha usato. Usando 'IDisposable' puoi beneficiare del supporto del framework e gli utenti finali possono trarre beneficio dal dover posizionare correttamente il codice cleanup. – user7116