Se si fa riferimento al momento in cui viene chiamato il distruttore sugli oggetti, quindi è il garbage collector, la programmazione può avere pochissima influenza su di esso ed è esplicitamente non deterministico in base alla definizione del linguaggio.
Se si fa riferimento alla chiamata IDisposable.Dispose(), ciò dipende dal comportamento degli oggetti che implementano l'interfaccia IDisposable.
In generale, l'ordine non è rilevante per la maggior parte degli oggetti Framework, tranne nella misura in cui è rilevante per il codice chiamante. Ma se l'oggetto A mantiene una dipendenza dall'oggetto B e l'oggetto B è disposto, allora potrebbe essere molto importante non fare certe cose con l'oggetto A.
Nella maggior parte dei casi, Dispose() non viene chiamato direttamente, ma piuttosto è chiamato implicitamente come parte di un'istruzione using o foreach, nel qual caso il modello di ordine inverso emergerà naturalmente, secondo l'incorporamento dell'istruzione.
using(Foo foo = new Foo())
using(FooDoodler fooDoodler = new FooDoodler(foo))
{
// do stuff
// ...
// fooDoodler automatically gets disposed before foo at the end of the using statement.
}
fonte
2009-11-09 19:42:16
Creato bene non va bene. Deve essere dipendente dall'ordine, dipendente dal rilascio e conosciuto in molte circostanze. Non potrebbe importare di più in tutte le implementazioni di database, transazioni e tutto ciò che viene eseguito su uno stack (la maggior parte dei software là fuori). I lock sono un altro esempio e ci sono pile di librerie non esterne e non povere che lo usano. Le operazioni sui file e i loro blocchi sono un'altra. Event leakage another. Qualsiasi risorsa non gestita a seconda di un'altra. Creazione e distruzione vanno di pari passo, e l'idioma non può essere preso a scatti come Inizializzazione delle risorse-È- "ben-Creazione". –
Così che il WC nell'ossimauro RIIWC viene sostituito con Aquisition, che implica una Release btw. E dal momento che la memoria e il gran numero di risorse sono per lo più astratte, ops, ecco l'idea ... e ne conseguono hack di ogni tipo. In breve, è semplicemente la natura del problema e conta molto. –
E anche se non sto difendendo la dipendenza dall'ordine, l'osservazione corretta è che è estremamente rilevante ma raramente desiderabile. Ma è qualcosa che persino le specifiche ufficiali di VM sono limitate a. Java impl in particolare e CLR in misura minore ma ancora significativa. È un trucco per non rompere grandi corpus di codice funzionante e ipotesi fatte, una decisione concisa da parte del compilatore e dei progettisti di backend di jit. Il codice che è in grado di elaborare in modo indipendente dall'ordine si presta a una vasta gamma di possibilità, ma può essere impossibile per molti scenari. –