Warning: fsockopen() [function.fsockopen]: unable to connect to 193.0.6.135:43 (Connection timed out) in /home/content/j/c/a/jcasti1226/html/administrator/components/com_joomlastats/count.classes.php on line 1044

Warning: fsockopen() [function.fsockopen]: unable to connect to 200.3.14.10:43 (Connection timed out) in /home/content/j/c/a/jcasti1226/html/administrator/components/com_joomlastats/count.classes.php on line 1044

Warning: fsockopen() [function.fsockopen]: unable to connect to 196.216.2.20:43 (Connection timed out) in /home/content/j/c/a/jcasti1226/html/administrator/components/com_joomlastats/count.classes.php on line 1044
Instanciar una Clase
Instanciar una Clase PDF Imprimir Correo electrónico
Valoración de los usuarios: / 30
PobreEl mejor 
C# - C#
Escrito por Juan Castillo   
Lunes 10 de Agosto de 2009 00:38
Share

Instanciar: Crear un objeto en la memoria

Una vez que tenemos una clase definida, lo único de lo que disponemos es de una especie de plantilla o molde a partir del cual podemos crear objetos en memoria.

Para crear esos objetos en Visual C# 2005 lo podemos hacer de dos formas, pero como veremos siempre será mediante la instrucción new que es la encargada de crear el objeto en la memoria y asignar la dirección del mismo a la variable usada en la parte izquierda de la asignación.

  Declarar primero la variable y después instanciarla

Lo primero que tenemos que hacer es declarar una variable del tipo que queremos instanciar, esto lo hacemos de la misma forma que con cualquier otro tipo de datos:

Cliente cli1;

Con esta línea de código lo que estamos indicando a C# es que tenemos intención de usar una variable llamada cli1 para acceder a una clase de tipo Cliente. Esa variable, cuando llegue el momento de usarla, sabrá todo lo que hay que saber sobre una clase Cliente, pero hasta que no tenga una "referencia" a un objeto de ese tipo no podremos usarla.

La asignación de una referencia a un objeto Cliente la haremos usando la instrucción new seguida del nombre de la clase:

cli1 = new Cliente();

A partir de este momento, la variable cli1 tiene acceso a un nuevo objeto del tipo Cliente, por tanto podremos usarla para asignarle valores y usar cualquiera de los miembros que ese tipo de datos contenga:

cli1.Nombre = "Antonio";
cli1.Apellidos = "Ruiz Rodríguez";

cli1.Saludar();

 

 

Declarar e instanciar en un solo paso

La otra forma de instanciar una clase es haciéndolo al mismo tiempo que la declaramos. En C# esto se hace como si uniéramos la declaración y la instanciación en una sola instrucción:

Cliente cli2 = new Cliente();

De esta forma se asignará a la variable cli2 una referencia a un nuevo objeto creado en la memoria, el cual será totalmente independiente del resto de objetos creados con esa misma clase.

 

 

El constructor: El punto de inicio de una clase

Cada vez que creamos un nuevo objeto en memoria estamos llamando al constructor de la clase. En Visual C# 2005 el constructor es una especie de método que se llama de la misma forma que la clase.

En el constructor de una clase podemos incluir el código que creamos conveniente, pero realmente solamente deberíamos incluir el que realice algún tipo de inicialización, en caso de que no necesitemos realizar ningún tipo de inicialización, no es necesario definir el constructor, ya que el propio compilador lo hará por nosotros. Esto es así porque todas las clases deben implementar un constructor, por tanto si nosotros no lo definimos, lo hará el compilador de C#.

Si nuestra clase Cliente tiene un campo para almacenar la fecha de creación del objeto podemos hacer algo como esto:

class Cliente
{
    public string Nombre;
    public string Apellidos;
    public DateTime FechaCreacion;

    public Cliente()
    {
        FechaCreacion = DateTime.Now;
    }
}

De esta forma podemos crear un nuevo Cliente y acto seguido comprobar el valor del campo FechaCreacion para saber la fecha de creación del objeto.

En los constructores también podemos hacer las inicializaciones que, por ejemplo permitan a la clase a conectarse con una base de datos, abrir un fichero o cargar una imagen gráfica, etc.

 

 

Constructores parametrizados

De la misma forma que podemos tener métodos sobrecargados, también podemos tener constructores sobrecargados, ya que en C# el constructor es como una función con un tratamiento especial que devuelve un nuevo objeto.

La ventaja de tener constructores que admitan parámetros es que podemos crear nuevos objetos indicando algún parámetro, por ejemplo un fichero a abrir o, en el caso de la clase Cliente, podemos indicar el nombre y apellidos del cliente o cualquier otro dato que creamos conveniente.

Para comprobarlo, podemos ampliar la clase definida anteriormente para que también acepte la creación de nuevos objetos indicando el nombre y los apellidos del cliente.

class Cliente;
{
    public string Nombre;
    public string Apellidos;
    public DateTime FechaCreacion;

    public Cliente()
    {
        FechaCreacion = DateTime.Now;
    }

    public Cliente(string elNombre, string losApellidos)
    {
        Nombre = elNombre;
        Apellidos = losApellidos;
        FechaCreacion = DateTime.Now;
    }
}

Teniendo esta declaración de la clase Cliente, podemos crear nuevos clientes de dos formas:

Cliente c1 = new Cliente();

Cliente c2 = new Cliente("Jose", "Sánchez");

Como podemos comprobar, en ciertos casos es más intuitiva la segunda forma de crear objetos del tipo Cliente, además de que así nos ahorramos de tener que asignar individualmente los campos Nombre y Apellidos.

Esta declaración de la clase Cliente la podríamos haber hecho de una forma diferente. Por un lado tenemos un constructor "normal" (no recibe parámetros) en el que asignamos la fecha de creación y por otro el constructor que recibe los datos del nombre y apellidos. En ese segundo constructor también asignamos la fecha de creación, ya que, se instancie como se instancie la clase, nos interesa saber siempre la fecha de creación. En este ejemplo, por su simpleza no es realmente un problema repetir la asignación de la fecha, pero si en lugar de una inicialización necesitáramos hacer varias, la verdad es que nos encontraríamos con mucha "duplicidad" de código. Por tanto, en lugar de asignar los datos en dos lugares diferentes, podemos hacer esto otro:

class Cliente
{
    public string Nombre;
    public string Apellidos;
    public DateTime FechaCreacion;

    public Cliente()
    {
        FechaCreacion = DateTime.Now;
    }

    public Cliente(string elNombre, string losApellidos) : this()
    {
        Nombre = elNombre;
        Apellidos = losApellidos;
    }
}

Es decir, desde el constructor con parámetros llamamos al constructor que no los tiene, consiguiendo que también se asigne la fecha.
La instrucción this se emplea para acceder a la instancia actual, es decir al objeto que está en la memoria, y cuando lo usamos de la forma mostrada en el código, realmente llama al constructor, en este caso sin parámetros, aunque de haberlo necesitado podemos indicarle los argumentos que creamos conveniente, siempre que exista un constructor con ese número de parámetros.
La llamada a otros constructores de la misma instancia, solo podemos hacerla desde un constructor y esa llamada debe estar antes del inicio del código de la clase, es decir, antes de la llave de apertura.

 

 

Cuando C# no crea un constructor automáticamente

Tal como hemos comentado, si nosotros no definimos un constructor, lo hará el propio compilador de Visual C# 2005, y cuando lo hace automáticamente, siempre es un constructor sin parámetros.

Pero hay ocasiones en las que nos puede interesar que no exista un constructor sin parámetros, por ejemplo, podemos crear una clase Cliente que solo se pueda instanciar si le pasamos, por ejemplo el número de identificación fiscal, (NIF), en caso de que no se indique ese dato, no podremos crear un nuevo objeto Cliente; de esta forma nos aseguramos de que el NIF siempre esté especificado. Seguramente por ese motivo, si nosotros definimos un constructor con parámetros, C# no lo crea automáticamente sin parámetros. Por tanto, si definimos un constructor con parámetros en una clase y queremos que también tenga uno sin parámetros, lo tenemos que definir nosotros mismos, aunque no es necesario que el constructor sin parámetros ejecute código, puede estar declarado sin más.

 

 

El destructor: El punto final de la vida de una clase

De la misma forma que una clase tiene su punto de entrada o momento de nacimiento en el constructor, también tienen un sitio que se ejecutará cuando el objeto creado en la memoria ya no sea necesario, es decir, cuando acabe la vida del objeto creado.

El destructor de C# se llama igual que la clase pero precedida del carácter ~ y no puede tener ningún modificador de visibilidad. Y solo es necesario definirlo si nuestra clase utiliza algún tipo de recurso, por tanto no es necesario definirlo si no tenemos que liberar expresamente algún recurso asignado en el constructor.

La definición del destructor de nuestra clase Cliente podía ser algo como esto:

~Cliente()
{
}

El que un destructor no sea accesible externamente es por la sencilla razón de que es el propio CLR el que se encarga de gestionar la destrucción de los objetos que ya no son utilizados. Debido a que no es posible invocar al destructor desde el objeto creado en la memoria, debemos implementar explícitamente un método que sea el que se encargue de hacer esa limpieza de los recursos utilizados por nuestra clase, ese método suele tener el nombre Close o Dispose, en este último caso, lo que se recomienda es que nuestra clase implemente la interfaz IDisposable con idea de que si no se llama expresamente al método que libera la memoria, sea el propio runtime del .NET Framework el que lo llame cuando el objeto ya no sea necesario mantenerlo en memoria.

Es importante saber que los destructores no se llaman de forma inmediata, es decir, es posible que un objeto ya no se esté usando, pero el CLR no llamará al destructor hasta que no lo crea conveniente, por tanto si nuestra clase utiliza recursos externos es imperativo que el usuario que utilice nuestra clase llame de forma explícita al método que hayamos definido para liberar esos recursos.

Última actualización el Lunes 10 de Agosto de 2009 00:40
 

Buscar


Visitantes de hoy:83
Visitantes de ayer:143
Visitas del mes:3775

Social

 
 

iwebplanet Submit your site in a website directory for free! This business is listed under Development Tools Directory

RocketTheme Joomla Templates