Lo scopo dell'interfaccia IDisposable
è di rilasciare le risorse non gestite in modo ordinato. Va di pari passo con la parola chiave using
che definisce un ambito dopo il quale viene eliminata la risorsa in questione.L'uso improprio è suscettibile di trarre vantaggio dall'uso di dichiarazioni considerate dannose?
Poiché questo meachismo è così accurato, sono stato ripetutamente tentato di fare in modo che le classi implementino IDisposable
in modo da abusare di questo meccanismo in modi per cui non è previsto. Ad esempio, si potrebbe implementare le classi per gestire contesti annidati in questo modo:
class Context : IDisposable
{
// Put a new context onto the stack
public static void PushContext() { ... }
// Remove the topmost context from the stack
private static void PopContext() { ... }
// Retrieve the topmost context
public static Context CurrentContext { get { ... } }
// Disposing of a context pops it from the stack
public void Dispose()
{
PopContext();
}
}
uso nel chiamare il codice potrebbe essere simile a questo:
using (Context.PushContext())
{
DoContextualStuff(Context.CurrentContext);
} // <-- the context is popped upon leaving the block
(Si prega di notare che questo è solo un esempio e non al argomento di questa domanda.)
Il fatto che venga richiamato lasciando l'ambito dell'istruzione using
può anche essere sfruttato per implementare tutti i tipi di cose che dipendono dall'ambito, ad esempio temporizzatori. Questo potrebbe anche essere gestito utilizzando un costrutto try ... finally
, ma in tal caso il programmatore dovrebbe chiamare manualmente un metodo (ad esempio Context.Pop
), che il costrutto using
potrebbe fare per thon.
Questo utilizzo di IDisposable
non coincide con lo scopo previsto as stated in the documentation, tuttavia la tentazione persiste.
Ci sono ragioni concrete per illustrare che questa è una cattiva idea e dissipare le mie fantasie per sempre, ad esempio complicazioni con garbage collection, gestione delle eccezioni, ecc. O dovrei andare avanti e concedermi abusando di questo concetto di linguaggio in questo modo ?
Ci sono molti altri concetti che potrebbero essere utilizzati impropriamente, il precedente è uno di questi, l'unica cosa è ** leggibilità **, ricorda che il tuo codice dovrebbe essere chiaro/leggibile e manutenibile da altri sviluppatori. – Habib
Sono d'accordo con Habib. Pensa sempre al povero bastardo che dovrà lavorare con il tuo codice tra 18 mesi. c'è una buona possibilità che quel bastardo sia te :-) –
È una domanda soggettiva, ma potresti notare che il framework MVC di ASP.NET abusa di IDisposable in questo modo - ad esempio 'FormExtensions.BeginForm' – Joe