Con relativamente poche eccezioni (la maggior parte delle quali potrebbero essere descritte come approcci meno pericolosi per gestire un codice mal progettato che non può essere modificato), ogni istanza di IDisposable
dovrebbe in ogni momento avere esattamente una proprietario ben definito. Nei casi in cui un metodo restituisce qualcosa di un tipo che implementa IDisposable
, il contratto per il metodo specificherà se il metodo sta cedendo la proprietà (nel qual caso il chiamante dovrebbe accertarsi che l'oggetto venga eliminato - eliminando l'oggetto stesso o cedendo la proprietà a qualcun altro) o se il metodo sta semplicemente restituendo un riferimento a un oggetto di proprietà di qualcun altro.
In codice correttamente scritto, la questione se un oggetto debba o meno essere smaltito è raramente una chiamata di giudizio. Il proprietario di un oggetto dovrebbe assicurarsi che venga eliminato; nessun altro dovrebbe disporlo. Occasionalmente può essere necessario che un metodo accetti un parametro che indica se il metodo deve trasferire la proprietà di uno IDisposable
. Ad esempio, se il codice vuole creare un suono, passarlo a un metodo "avvia la riproduzione del suono" e non vuole più occuparsi di quel suono, potrebbe essere più comodo avere il codice per riprodurre il suono accetta e dispose il suono quando è fatto; se il codice vuole essere in grado di riprodurre un suono ripetutamente, tuttavia, e farà in modo che l'oggetto sonoro rimanga attivo fino a quando è necessario, sarebbe più conveniente per il codice di riproduzione audio non assumere la proprietà. L'utilizzo di metodi separati può in qualche modo essere più pulito, ma l'utilizzo di un parametro può facilitare l'incapsulamento.
In genere, quando il codice restituisce un elenco di oggetti che implementano IDisposable
, lo scopo del codice è quello di identificare oggetti senza trasmettere alcun interesse di proprietà in loro. In assenza di un interesse di proprietà, il codice che riceve tale lista dovrebbe non chiamare Dispose
su di esso.
Non c'è modo per il 'Creatore' di disporne o parti all'interno delle classi in quanto non esiste un distruttore. Non hanno il controllo su di te impostando una variabile su niente per poi smaltire lì oggetti o contenuti che richiedono lo smaltimento. – OneFineDay
Certo, per Process.GetProcesses() puoi mantenere un array interno di tutti gli oggetti Process() che hai mai restituito ai chiamanti e quindi controllare periodicamente se sei l'unico che ha un riferimento all'oggetto e se è così Dispose() – Denis
@Denis Determinare se qualcun altro ha un riferimento ad esso non è qualcosa che puoi effettivamente fare. – Servy