No. In realtà, non si vuole veramente che si tratti di garbage collection: il prompt del garbage collector molto spesso ridurrà le prestazioni.
Quello che fai vuoi è quello di disporre delle risorse non gestite in modo tempestivo - ed è qui che IDisposable
entra, insieme con la using
dichiarazione:
void MyFunction()
{
using (Bitmap image = RetrieveImage())
{
DoSomething(image);
}
}
che chiamerà image.Dispose()
in quanto lascia il using
, indipendentemente dal fatto che DoSomething
abbia fatto o meno un'eccezione.
Non è necessario utilizzare la variabile in più anche se - a meno che non si cambia DoSomething
di prendere un Func<Bitmap>
invece, così invece di:
void DoSomething(Bitmap image)
{
// Code here
}
...
DoSomething(RetrieveImage());
avresti:
void DoSomething(Func<Bitmap> imageProvider)
{
using (Bitmap image = imageProvider())
{
// Code here
}
}
...
DoSomething(() => RetrieveImage());
Si noti che che non offre l'opportunità di passare in una bitmap senza da smaltire, il che potrebbe essere un problema se si desidera utilizzarlo nuovamente in un secondo momento. Comunque, è una buona tecnica per saperlo.
MODIFICA: come sottolineato da Mbeckish nei suoi commenti, non ci sono molti vantaggi rispetto allo smaltimento della bitmap entro RetrieveImage
. Ecco una variante del modello però:
public void ApplyToEachLineInFile(string file, Action<string> action)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
action(line);
}
}
}
qui la logica "acquistare e cedere" è incapsulato, senza che il chiamante preoccuparsi - ma il chiamante può ancora essere molto flessibile in termini di complessità della logica passano poll.
fonte
2010-01-27 21:07:11
non vedo alcuna differenza tra 1 und 2. Perché dovrebbe comportarsi diverso garbage collection-saggio? – flq
Non sono davvero un sostenitore di "cosa vorresti questo" tipo di commenti, ma seriamente, il garbage collector .NET sa davvero meglio del programmatore quando è un buon momento per fare un po 'di pulizia. tenere presente che .NET VM non è un sistema in tempo reale. inoltre, se si dispone di risorse non gestite, utilizzare IDisposable e using. –
Ci si deve fidare del garbage collector standard: è molto probabile che si perderanno prestazioni se si costringerebbe la garbage collection. C'è una ragione particolare per cui ti preoccupi di quando succede? – jball