Domanda

Ad esempio,

int myResult= (new UnmanagedResourceUsingMemorySuckingPig()).GetThingsDone(id);

Non esiste un blocco utilizzante, non esiste un modo ovvio per utilizzare un blocco utilizzante, non esiste un modo ovvio per chiamare Dispose (). E ovviamente UnmanagedResourceUsingMemorySuckingPig implementa IDisposable.

È stato utile?

Soluzione

Se il finalizzatore di quella classe chiama Dispose () , sì. In caso contrario, no.

(modifica) Solo alcuni ulteriori informazioni :

  

Non dare per scontato che sarà Dispose   chiamato. Risorse non gestite di proprietà di a   il tipo dovrebbe anche essere rilasciato in a   Finalizza il metodo nel caso in cui   Dispose non viene chiamato.

Modifica

Per chiarire la modifica di cui sopra, ho visto molte persone (in questo thread, su SO e altrove) affermare che " Il GC chiamerà Dispose () quando l'oggetto viene rimosso. " ; Non è assolutamente il caso. Sì, un buon programmatore difensivo che scrive un componente suppone che Dispose () non verrà chiamato esplicitamente e lo fa nel finalizzatore. Tuttavia, un buon programmatore difensivo USANDO un componente deve presumere che il finalizzatore NON chiami Dispose () . Non è presente alcuna chiamata automatica di Dispose () nel Garbage Collector . Questa funzionalità è disponibile SOLO se il finalizzatore chiama Dispose () .

Altri suggerimenti

Non ci credo. Dovrai scrivere:

 using (UnmanagedResourceUsingMemorySuckingPig urumsp = new UnmanagedResourceUsingMemorySuckingPig()) 
{
  myResult= urumsp.GetThingsDone(id);
}

Puoi essere sicuro che se ha un Finalizzatore (distruttore) verrà chiamato. Un finalizzatore può chiamare Dispose () ma l'implementazione usuale è che sia il finalizzatore che Dispose () chiamano protetto Dispose (bool) .

In altre parole, dipende dall'implementazione di UnmanagedResourceUsingMemorySuckingPig , se segue le linee guida, l'oggetto anonimo verrà ripulito, ma non in modo efficiente come con un che usa blocco.

No. Tuttavia, il GC alla fine raccoglierà l'oggetto e noterà che è finalizzabile (è finalizzabile, giusto?) E lo finalizzerà per te. Dispose serve per la pulizia deterministica delle risorse.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top