Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

Object::Finalize (Método)

Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por la recolección de elementos no utilizados.

Espacio de nombres:  System
Ensamblado:  mscorlib (en mscorlib.dll)

protected:
virtual void Finalize()

El método de Finalize se utiliza para realizar operaciones de limpieza en los recursos no administrados retenidos por el objeto actual antes de que se destruya el objeto. El método está protegido y, por lo tanto, solo se puede obtener acceso a él a través de esta clase o de una clase derivada.

En esta sección:

Cómo funciona la finalización

La clase de Object no proporciona ninguna implementación del método de Finalize , y el recolector de elementos no utilizados no marca los tipos derivados de Object para la finalización a menos que reemplazan el método de Finalize .

Si un tipo invalida el método de Finalize , el recolector de elementos no utilizados agrega una entrada para cada instancia de tipo a una estructura interna denominada cola de finalización. La cola de finalización contiene entradas para todos los objetos del montón administrado cuyo código de finalización debe ejecutarse antes de que el recolector de elementos no utilizados pueda reclamar la memoria. El recolector de elementos no utilizados llama al método de Finalize automáticamente en las condiciones siguientes:

  • Después de que un objeto esté inaccesible, a menos que el objeto ha sido eximido de finalización mediante una llamada al método de GC::SuppressFinalize .

  • Durante el cierre de un dominio de aplicación, a menos que el objeto está exento de finalización. Durante el cierre, incluso se concluyen los objetos que aún están accesibles.

Finalize automáticamente sólo se llama una vez en una instancia determinada, a menos que el objeto re- se registra mediante un mecanismo como GC::ReRegisterForFinalize y el método de GC::SuppressFinalize no se ha llamado posteriormente.

Las operaciones de Finalize tienen las siguientes limitaciones:

  • El momento exacto en que se ejecuta el finalizador durante la recolección de elementos no utilizados no está definido. Para garantizar la versión determinista de los recursos de las instancias de la clase, implemente un método de Close o proporcione una implementación de IDisposable::Dispose .

  • No se garantiza que los finalizadores de dos objetos se ejecuten en un orden determinado, aunque un objeto haga referencia al otro. Es decir, si el objeto A tiene una referencia a b del objeto y tienen finalizadores, b de objeto podría haberse concluida ya cuando el finalizador del objeto A inicia.

  • El subproceso en el que el finalizador se ejecuta está sin especificar.

El método de Finalize podría no ejecutarse hasta su finalización ni podría ejecutarse en absoluto en circunstancias excepcionales siguientes:

  • Si otros bloques finalizador indefinidamente (entra en un bucle infinito, intenta obtener un bloqueo que nunca puede obtener, etc.). Como el runtime intenta finalizadores completamente, otros finalizadores no pueden llamar si un finalizador bloqueos indefinidamente.

  • Si el proceso finaliza sin dar al tiempo de ejecución una oportunidad de limpiar. En este caso, la primera notificación de terminación del proceso por parte del motor en tiempo de ejecución es una notificación DLL_PROCESS_DETACH.

El tiempo de ejecución continúa finaliza objetos durante el cierre solo mientras el número de objetos susceptible continúa disminuyendo.

Si Finalize o un reemplazo de Finalize produce una excepción, el runtime no se hospeda en una aplicación que reemplace la directiva predeterminada, el runtime finalizará el proceso y ningún tryactivo/finally bloqueos ni se ejecutan los finalizadores. Este comportamiento garantiza la integridad del proceso si el finalizador no puede liberar ni destruir recursos.

Notas para los implementadores

Debe reemplazar Finalize para una clase que utiliza recursos no administrados como identificadores de archivos o conexiones a bases de datos que deban liberarse cuando el objeto administrado que las utiliza se descarta durante la recolección de elementos no utilizados.

Nota importanteImportante

Si un objeto de SafeHandle disponible que envuelve el recurso no administrado, la alternativa recomendada es implementar el modelo de dispose con un identificador y no un reemplazo seguros Finalize. Para obtener más información, vea la sección de La alternativa SafeHandle .

El método de Object.Finalize no hace nada de forma predeterminada, pero debe reemplazar Finalize sólo si es necesario, y liberar solo los recursos no administrados. Reclamar la memoria durante la recolección de elementos no utilizados suele durar mucho si una operación de finalización se ejecuta, porque requiere al menos dos recolecciones de elementos no utilizados. Además, debe reemplazar el método de Finalize para los tipos de referencia sólo. Common Language Runtime concluye únicamente los tipos de referencia. Omite los finalizadores en tipos de valor.

Todas las implementaciones de Finalize en un tipo derivado deben llamar a la correspondiente implementación de tipo base de Finalize. Este es el único caso en el que se permite al código de la aplicación llamar a Finalize.

NotaNota

El compilador de C# no le permite invalidar el método de Finalize . En su lugar, proporciona un finalizador implementando un destructor para la clase. Un destructor C# llama automáticamente al destructor de su clase base.

Visual C++ también proporciona su propia sintaxis para implementar el método de Finalize . Para obtener más información, vea la sección “Destructores y los finalizadores” de Cómo: Cree instancias de las clases y Structs.

Dado que la recolección de elementos no utilizados es no determinista, no sabe exacto cuando el recolector de elementos no utilizados realiza la finalización. Para liberar recursos inmediatamente, también puede implementar elimina el modelo y la interfaz de IDisposable . La implementación de IDisposable::Dispose puede llamar a los consumidores de la clase para liberar recursos no administrados, y puede utilizar el método de Finalize para liberar recursos no administrados en caso que el método de Dispose no tiene nombre.

Finalize puede realizar prácticamente cualquier medidas, incluida la resurrección de un objeto (es decir, creando el objeto accesible de nuevo) después de que se haya limpiado durante la recolección de elementos no utilizados. Sin embargo, el objeto sólo puede restablecerse una vez; no se puede llamar a Finalize en objetos restablecidos durante la recolección de elementos no utilizados. Hay una pasos que la implementación de Finalize nunca debe realizar: nunca debe producir una excepción.

La alternativa SafeHandle

Crear finalizadores predecibles suele ser difícil, ya que no puede realizar suposiciones sobre el estado de la aplicación y, como las excepciones no controladas del sistema como OutOfMemoryException y StackOverflowException finalizan el finalizador. En lugar de implementar un finalizador para que la clase liberar recursos no administrados, puede utilizar un objeto que se deriva de la clase de System.Runtime.InteropServices::SafeHandle para ajustar los recursos no administrados, y después implementa el modelo dispose sin un finalizador. .NET Framework proporciona las siguientes clases en el espacio de nombres Microsoft.Win32 derivados de System.Runtime.InteropServices::SafeHandle:

El ejemplo siguiente utiliza elimina el modelo con controladores seguros en lugar de reemplazar el método de Finalize . Define una clase de FileAssociation que contenga información sobre la aplicación que controla los archivos con la extensión de archivo determinada. Los dos identificadores de registro devueltos como parámetros de out mediante llamadas RegOpenKeyEx a funciones de Windows se pasan al constructor de SafeRegistryHandle . El método protegido de Dispose de tipo llama al método de SafeRegistryHandle.Dispose para liberar estos dos identificadores.

No hay ningún ejemplo de código disponible o este idioma no es compatible.

El siguiente ejemplo comprueba que se llama al método Finalize cuando se destruye un objeto que invalida Finalize. Tenga en cuenta que, en una aplicación de producción, el método Finalize se invalidaría para liberar recursos no administrados retenidos por el objeto. También observe que el ejemplo de C# proporciona un destructor en lugar de invalidar el método Finalize.

No hay ningún ejemplo de código disponible o este idioma no es compatible.

Para obtener un ejemplo adicional que invalide el método de Finalize , vea el método de GC::SuppressFinalize .

.NET Framework

Compatible con: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Compatible con: 4, 3.5 SP1

Biblioteca de clases portable

Compatible con: Biblioteca de clases portable

.NET para aplicaciones de la Tienda Windows

Compatible con: Windows 8

.NET para aplicaciones de Windows Phone

Compatible con: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft