InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
Comparativa de sentencias VB.Net vs C#
Aprende Ajax desde cero
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)

Afiliados
La Web del programador
MundoProgramacion


Destructores

    Al igual que es posible definir métodos constructores que incluyan código que gestione la creación de objetos de un tipo de dato, también es posible definir un destructor que gestione cómo se destruyen los objetos de ese tipo de dato. Este método suele ser útil para liberar recursos tales como los ficheros o las conexiones de redes abiertas que el objeto a destruir estuviese acaparando en el momento en que se fuese a destruir.

    La destrucción de un objeto es realizada por el recolector de basura cuando realiza una  recolección de basura  y detecta que no existen referencias a ese objeto ni en pila, ni en registros ni desde otros objetos sí referenciados. Las recolecciones se inician automáticamente cuando el recolector detecta que queda poca memoria libre o que se va a finalizar la ejecución de la aplicación, aunque también puede forzarse llamando al método Collect() de la clase System.GC

    La sintaxis que se usa para definir un destructor es la siguiente:


~<nombreTipo>()
{
 <código>
}

    Tras la ejecución del destructor de un objeto de un determinado tipo siempre se llama al destructor de su tipo padre, formándose así una cadena de llamadas a destructores que acaba al llegarse al destructor de object. Éste último destructor no contiene código alguno, y dado que object no tiene padre, tampoco llama a ningún otro destructor.

    Los destructores no se heredan. Sin embargo, para asegurar que la cadena de llamadas a destructores funcione correctamente si no incluimos ninguna definición de destructor en un tipo, el compilador introducirá en esos casos una por nosotros de la siguiente forma:


~<nombreTipo>()
{}

    El siguiente ejemplo muestra como se definen destructores y cómo funciona la cadena de llamada a destructores:


using System;
class A
{
 ~A()
 {
  Console.WriteLine("Destruido objeto de clase A");
 }
}
class B:A
{
 ~B()
 {          
  Console.WriteLine("Destruido objeto de clase B");
 }
 public static void Main()
 {
  new B();
 }
}

    El código del método Main() de este programa crea un objeto de clase B pero no almacena ninguna referencia al mismo. Luego finaliza la ejecución del programa, lo que provoca la actuación del recolector de basura y la destrucción del objeto creado llamando antes a su destructor. La salida que ofrece por pantalla el programa demuestra que tras llamar al destructor de B se llama al de su clase padre, ya que es:



Destruido objeto de clase B

Destruido objeto de clase A

 

    Nótese que aunque no se haya guardado ninguna referencia al objeto de tipo B creado y por tanto sea inaccesible para el programador, al recolector de basura no le pasa lo mismo y siempre tiene acceso a los objetos, aunque sean inútiles para el programador.

    Es importante recalcar que no es válido incluir ningún modificador en la definición de un destructor, ni siquiera modificadores de acceso, ya que como nunca se le puede llamar explícitamente no tiene ningún nivel de acceso para el programador. Sin embargo, ello no implica que cuando se les llame no se tenga en cuenta el verdadero tipo de los objetos a destruir, como demuestra el siguiente ejemplo:


using System;
public class Base
{
 public virtual void F()
 {
  Console.WriteLine("Base.F");               
 }
 
 ~Base()
 {
  Console.WriteLine("Destructor de Base");
  this.F();
 }
}
public class Derivada:Base
{
 ~Derivada()
 {
  Console.WriteLine("Destructor de Derivada");
 }
 
 public override void F()
 {
  Console.WriteLine("Derivada.F()");
 }
 
 public static void Main()
 {
  Base b = new Derivada();                      
 }
}

    La salida mostrada que muestra por pantalla este programa al ejecutarlo es:


Destructor de Derivada

Destructor de Base

Derivada.F()

    Como se ve, aunque el objeto creado se almacene en una variable de tipo Base, su verdadero tipo es Derivada y por ello se llama al destructor de esta clase al destruirlo. Tras ejecutarse dicho destructor se llama al destructor de su clase padre siguiéndose la cadena de llamadas a destructores. En este constructor padre hay una llamada al método virtual F(), que como nuevamente el objeto que se está destruyendo es de tipo Derivada, la versión de F() a la que se llamará es a la de la dicha clase.

    Nótese que una llamada a un método virtual dentro de un destructor como la que se hace en el ejemplo anterior puede dar lugar a errores difíciles de detectar, pues cuando se llama al método virtual ya se ha destruido la parte del objeto correspondiente al tipo donde se definió el método ejecutado. Así, en el ejemplo anterior se ha ejecutado Derivada.F() tras Derivada.~F(), por lo que si en Derivada.F() se usase algún campo destruido en Derivada.~F() podrían producirse errores difíciles de detectar.


Inicio | Tutorial C# ConstructoresTutorial C#Propiedades Versión para imprimir Foros de consulta

 
funcion de destructor por rogelio
Respuesta recibida el [29/05/2009 05:01:51]
Para que puedo usar un destructor


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# ConstructoresTutorial C#Propiedades Versión para imprimir

Destructores
Autor: José Antonio González Seco
Visitas: 10996 Fecha de publicación: 13/10/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 198 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 297 | Comentarios: 1 | Archivo: Articulos
Visitas: 376 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 599 | Comentarios: 3 | Archivo: Articulos
Categorias: C#|ASP.NET
Visitas: 1171 | Comentarios: 4 | Archivo: Articulos
Visitas: 688 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|ASP|Windows XP|Windows 2003
Visitas: 821 | Comentarios: 2 | Archivo: Articulos
Categorias: Java|Solaris
Visitas: 576 | Comentarios: 0 | Archivo: Articulos
Visitas: 1461 | Comentarios: 1 | Archivo: Articulos
Categorias: ADO.NET
Visitas: 1513 | Comentarios: 3 | Archivo: Articulos
Categorias: ASP.NET

Útimos temas recibidos en los foros ...
objetos helper php bajo oracle por objetos_helper_oracle ... [ISAPI] 0 02/07/2009
ranuras isa o pci por sara ... [Access] 5 30/03/2006
descargar tutorial C# por afmp ... [C#] 54 14/10/2008
Tutorial TOAD para Oracle en Español por ijpj ... [ORACLE] 19 14/03/2009
quiero mi numero de mi autogenerado por pablo ... [Visual Basic .NET] 1 15/06/2009
Ayuda con cargar fotografias de otra pc por Alex ... [ASP.NET] 0 01/07/2009
splash screen por zelca ... [Visual Basic .NET] 0 01/07/2009
Error de inicio de aplicación por Danrre ... [C#] 0 30/06/2009
sumar los precios de la columna "precio" del grig por jardinderosas ... [C#] 7 01/11/2007
Curso de Fundamentos de Java en vídeo. por Videocursos ... [Java] 4 08/03/2009
Ayuda a resolver un Codigo solo en Consola por RonaldP ... [Visual Basic .NET] 0 30/06/2009
Interface de especificaciones Modulo de calidad por Richard ... [ORACLE] 0 30/06/2009

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 El lenguaje SQL    forma parte de...Tutorial SQL
01/01/2007 Iteradores    forma parte de...Tutorial C#
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
20/03/2008 Funciones integradas de Transact SQL (I)    forma parte de...Tutorial de Transact SQL
08/01/2008 Teclas Rápidas en Vista
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
24/07/2006 SQL Dinamico    forma parte de...Tutorial PL/SQL
22/10/2005 Tablas    forma parte de...Tutorial SQL
14/04/2009 Tutorial rápido de Entity Framework y Linq To Entities

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]