2011-10-22 11 views
6

Estaba leyendo este artículo, “Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework”, por Jeffrey Richter, y yo no podía pensar en ninguna muestra de la vida real para el uso de ReRegisterForFinalize o SuppressFinalize.ReRegisterForFinalize SuppressFinalize ejemplo real

¿Alguien podría proporcionarme algunos ejemplos?

+0

'SuppressFinalize' es común, pero no tengo idea de cuándo me gustaría utilizar' ReRegisterForFinalize'. – CodesInChaos

Respuesta

9

Un puñado de lugares se usa en .NET framework, siempre es un buen lugar para buscar. Los patrones básicos son:

  • un objeto eliminado se vuelve a utilizar. El método Dispose() ha llamado SuppressFinalize por lo que debe volver a registrarse (NativeWindow, RequestContextBase, TaskExceptionHolder class)
  • el finalizador ha fallado y ha detectado una excepción. Poco para hacer, pero volver a intentar más tarde. Ese código se envuelve con if (! Environment.HasShutdownStarted & &! AppDomain.CurrentDomain.IsFinalizingForUnload()) para asegurarse de que haciendo esto tiene sentido (DynamicResolver y la clase LoaderAllocatorScout)
  • el objeto participa en un esquema de almacenamiento en caché y se re- en caché (clase OverlappedData)
3

La implementación de IDisposable a menudo requiere SuppressFinalize: mira here o para el código.

No tengo un buen ejemplo en ReRegisterForFinalize ahora.

+1

OK 'SuprimirFinalizar' parece bastante directo, después de leer esas muestras. evitar que se llame al costoso método de finalización si tiro el objeto por mi cuenta. – Nahum

1

Necesita ReRegisterForFinalize al resucitar una instancia. La resurrección (mencionada en el artículo vinculado) es la acción de volver a enraizar un objeto desde su destructor (finalizador).

Eso solo mueve la pregunta a "cuándo resucitarías un objeto". En mi respuesta al this question, especulé que un connectionpool o una construcción similar podría usarlo.

+0

Todavía no tengo idea de cuándo quiero usar 'ReRegisterForFinalize' – Nahum

+1

En la aplicación 'normal' o en el código de la biblioteca no lo haría. Un ConnectionPool es una pieza de software altamente especializada. –

Cuestiones relacionadas