Beruflich Dokumente
Kultur Dokumente
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 instruccin new que es la encargada de crear el objeto en la memoria y asignar la direccin del mismo a la variable usada en la parte izquierda de la asignacin.
Con esta lnea de cdigo lo que estamos indicando a C# es que tenemos intencin 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 asignacin de una referencia a un objeto Cliente la haremos usando la instruccin 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 Rodrguez";
cli1.Saludar();
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.
De esta forma podemos crear un nuevo Cliente y acto seguido comprobar el valor del campo FechaCreacion para saber la fecha de creacin del objeto. En los constructores tambin 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 grfica, etc.
Constructores parametrizados
De la misma forma que podemos tener mtodos sobrecargados, tambin podemos tener constructores sobrecargados, ya que en C# el constructor es como una funcin con un tratamiento especial que devuelve un nuevo objeto. La ventaja de tener constructores que admitan parmetros es que podemos crear nuevos objetos indicando algn parmetro, 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 tambin acepte la creacin de nuevos objetos indicando el nombre y los apellidos del cliente.
class Cliente; { public string Nombre; public string Apellidos; public DateTime FechaCreacion;
public Cliente(string elNombre, string losApellidos) { Nombre = elNombre; Apellidos = losApellidos; FechaCreacion = DateTime.Now; } }
Teniendo esta declaracin de la clase Cliente, podemos crear nuevos clientes de dos formas:
Cliente c1 = new Cliente();
Como podemos comprobar, en ciertos casos es ms intuitiva la segunda forma de crear objetos del tipo Cliente, adems de que as nos ahorramos de tener que asignar individualmente los campos Nombre y Apellidos. Esta declaracin de la clase Cliente la podramos haber hecho de una forma diferente. Por un lado tenemos un constructor "normal" (no recibe parmetros) en el que asignamos la fecha de creacin y por otro el constructor que recibe los datos del nombre y apellidos. En ese segundo constructor tambin asignamos la fecha de creacin, ya que, se instancie como se instancie la clase, nos interesa saber siempre la fecha de creacin. En este ejemplo, por su simpleza no es realmente un problema repetir la asignacin de la fecha, pero si en lugar de una inicializacin necesitramos hacer varias, la verdad es que nos encontraramos con mucha "duplicidad" de cdigo. 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(string elNombre, string losApellidos) : this() { Nombre = elNombre; Apellidos = losApellidos; } }
Es decir, desde el constructor con parmetros llamamos al constructor que no los tiene, consiguiendo que tambin se asigne la fecha. La instruccin 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 cdigo, realmente llama al constructor, en este caso sin parmetros, aunque de haberlo
necesitado podemos indicarle los argumentos que creamos conveniente, siempre que exista un constructor con ese nmero de parmetros. La llamada a otros constructores de la misma instancia, solo podemos hacerla desde un constructor y esa llamada debe estar antes del inicio del cdigo de la clase, es decir, antes de la llave de apertura.
El que un destructor no sea accesible externamente es por la sencilla razn de que es el propio CLR el que se encarga de gestionar la destruccin 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 explcitamente un mtodo que sea el que se encargue de hacer esa limpieza de los recursos utilizados por nuestra clase, ese mtodo 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 mtodo 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 explcita al mtodo que hayamos definido para liberar esos recursos.