jueves, 4 de junio de 2009

Aplicacion de constructores y destructores

Aplicación de constructores

Aquí se muestran varios ejemplos de constructores y sus diversas formas de aplicarse

Ejemplo 1 // Uso del constructor predeterminado.(No se define otro constructor)

using System; using C = System.Console;

class Persona {

  private string nombre;
  private int edad;
 
  public void asignaNombre( string n)
  {
 
    nombre = n; 
 
  } 
 
  public void asignaEdad( int e)
  {
 
    edad = e; 
 
  } 
 
  public string daNombre( )
  {
 
    return nombre; 
 
  } 
 
  public int daEdad( )
  {
 
    return edad ; 
 
  } 
 
 } 

public class Principal {

  public static void Main( )
  {
 
  Persona p = new Persona( ) ;
  // Se invoca al constructor
 
  //predeterminado. 
 
  p.asignaNombre(“Luis”);
  p.asignaEdad(25);
 
  C.Write Line(“Nombre: {0} , Edad: {1}”, p.daNombre(), p.daEdad()); 

}

}


Ejemplo 2 // Uso de un constructor con dos parámetros.(No se requiere un

constructor predefinido)

using System; using C = System.Console;

class Persona {

   private string nombre;
   private int edad;
 
   public Persona( string n, int e)
   {
 
      nombre = n; 
      edad = e; 
 
   } 
 
   public string daNombre( )
   {
 
      return nombre; 
 
   } 
 
   public int daEdad( )
   {
 
      return edad ; 
 
   } 

}

public class Principal {

   public static void Main( )
   {
 
   Persona p = new Persona( “Luis”, 25) ; 
 
   C.Write Line?(“Nombre: {0} , Edad: {1}”, p.daNombre(), p.daEdad()); 
 
   } 

}


Ejemplo 3 // Uso de un constructor con dos parámetros y el constructor predefinido.

using System; using C = System.Console;

class Persona {

   private string nombre;
   private int edad;
 
   public Persona(string n, int e)
   {
 
      nombre = n;
      edad = e;
 
   }
 
   public Persona() // Constructor predeterminado, vuelto a escribir.
   {
 
   }
 
   public string daNombre()
   {
      ,…..return nombre;
   }
 
   public int daEdad()
   {
      …..return edad;
   }
 
      public void asignaNombre(string n)
   {
      …..nombre = n;
   }
 
   public void asignaEdad(int e)
   {
      …edad = e;
   }

}

public class Principal {

   public static void Main()
   {
 
   Persona pa = new Persona(“Luis”, 25);
   Persona pb = new Persona(); // Se invoca al constructor
   …………………………………………// predeterminado
   pb.asignaNombre(“Pepe”);
   pb.asignaEdad(19);
 
   C.Write Line(“Nombre: {0} , Edad: {1}”, pa.daNombre(),
   pa.daEdad());
   C.Write Line(“Nombre: {0} , Edad: {1}”, pb.daNombre(),
   pb.daEdad());
   C.Read();
 
   }

}


Aplicación de destructores

Para la mayoría de los objetos que la aplicación crea, puede utilizar el recolector de elementos no utilizados para realizar de forma implícita todas las tareas necesarias de administración de memoria. No obstante, cuando se crean objetos que encapsulan recursos no administrados, debe liberar explícitamente los recursos no administrados cuando la aplicación termine de utilizarlos. El tipo más habitual de recurso no administrado es un objeto que contiene un recurso del sistema operativo, como un archivo, ventana o conexión de red. Aunque el recolector de elementos no utilizados puede realizar el seguimiento de un objeto que encapsula un recurso no administrado durante su período de vida, no tiene un conocimiento específico de cómo limpiar el recurso. De forma predeterminada, el método Finalize no realiza ninguna acción. Si desea que el recolector de elementos no utilizados realice las operaciones de limpieza en el objeto antes de reclamar su memoria, debe reemplazar el método Finalize en su clase.

l recolector de elementos no utilizados realiza el seguimiento de los objetos que tienen métodos Finalize, utilizando una estructura interna denominada cola de finalización. Cada vez que la aplicación crea un objeto que tiene un método Finalize, el recolector de elementos no utilizados coloca una entrada en la cola de finalización que apunta a ese objeto. La cola de finalización contiene entradas para todos los objetos del montón administrado que necesitan que se llame a su código de finalización antes de que el recolector de elementos no utilizados reclame su memoria.

Un método Finalize no debería producir excepciones porque la aplicación no puede controlarlo y puede hacer que la aplicación finalice.

Implementar destructores o métodos Finalize puede tener un impacto negativo en el rendimiento y por lo tanto debería evitar su uso innecesariamente. Reclamar la memoria que utilizan los objetos con métodos Finalize requiere al menos dos recolecciones de elementos no utilizados. Cuando el recolector de elementos no utilizados realiza una recolección, reclama la memoria de los objetos inaccesibles sin finalizadores. En este momento, no puede recolectar los objetos inaccesibles que tienen finalizadores. En su lugar, quita las entradas correspondientes a estos objetos de la cola de finalización, y las coloca en una lista de objetos marcados para finalizar. Las entradas de esta lista apuntan a los objetos del montón administrado que están listos para que se llame a su código de finalización. El recolector de elementos no utilizados llama a los métodos Finalize de los objetos de esta lista; a continuación, quita las entradas de la lista. Una recolección de elementos no utilizados posterior determinará que los objetos finalizados se han recolectado correctamente porque ninguna de las entradas de la lista de objetos marcados para finalizar apunta hacia ellos. En esta recolección de elementos no utilizados posterior, se reclama la memoria del objeto.

Aplicación del objeto Finalize( );

protected override void Finalize()
{
    try
    {
        // cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

No hay comentarios:

Publicar un comentario