No. De hecho, realmente no desea que se recoja basura, lo que provocará que el recolector de basura con mucha frecuencia reduzca el rendimiento.
Lo que hace desea es disponer de los recursos no administrados de manera oportuna - y ahí es donde IDisposable
entra, junto con el using
declaración:
void MyFunction()
{
using (Bitmap image = RetrieveImage())
{
DoSomething(image);
}
}
que llamará image.Dispose()
ya que deja el using
declaración, ya sea o no DoSomething
lanzó una excepción.
Usted tiene que usar la variable adicional, aunque - a menos que cambie DoSomething
tomar un Func<Bitmap>
lugar, por lo que en lugar de:
void DoSomething(Bitmap image)
{
// Code here
}
...
DoSomething(RetrieveImage());
usted tendría que:
void DoSomething(Func<Bitmap> imageProvider)
{
using (Bitmap image = imageProvider())
{
// Code here
}
}
...
DoSomething(() => RetrieveImage());
nota de que ese no da la oportunidad de pasar en un mapa de bits sin que se desecha, lo que podría ser un problema si desea volver a utilizarlo más tarde. Aún así, es una buena técnica al menos saberlo.
EDITAR: Como mbeckish ha señalado en sus comentarios, no hay mucho beneficio aquí sobre la eliminación del mapa de bits dentro de RetrieveImage
. Aquí hay una variante en el patrón sin embargo:
public void ApplyToEachLineInFile(string file, Action<string> action)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
action(line);
}
}
}
Aquí se encapsula la lógica "adquirir y enajenar", sin que la persona que llama la preocupación de ella - pero la persona que llama todavía puede ser muy flexible en términos de la complejidad de la lógica que pasan en.
no veo ninguna diferencia entre 1 und 2. ¿Por qué debe comportarse colección en cuanto distinta de la basura? – flq
no soy realmente un defensor de los comentarios del tipo "¿qué quieres?", Pero en serio, el recolector de basura .NET realmente sabe mejor que el programador cuando es un buen momento para hacer una limpieza. tenga en cuenta que .NET VM no es un sistema en tiempo real. Además, si tiene recursos no administrados, use IDisposable y use. –
Debe confiar en el recolector de basura estándar: es muy probable que pierda rendimiento si fuerce la recolección de basura. ¿Hay alguna razón en particular por la que le preocupa cuándo ocurre? – jball