Sie sind auf Seite 1von 6

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 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.

Declarar primero la variable y despus 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 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();

Declarar e instanciar en un solo paso


La otra forma de instanciar una clase es hacindolo al mismo tiempo que la declaramos. En C# esto se hace como si uniramos la declaracin y la instanciacin en una sola instruccin:

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 mtodo que se llama de la misma forma que la clase. En el constructor de una clase podemos incluir el cdigo que creamos conveniente, pero realmente solamente deberamos incluir el que realice algn tipo de inicializacin, en caso de que no necesitemos realizar ningn tipo de inicializacin, 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 creacin 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 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() { FechaCreacion = DateTime.Now; }

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();

Cliente c2 = new Cliente("Jose", "Snchez");

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() { FechaCreacion = DateTime.Now; }

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.

Cuando C# no crea un constructor automticamente


Tal como hemos comentado, si nosotros no definimos un constructor, lo har el propio compilador de Visual C# 2005, y cuando lo hace automticamente, siempre es un constructor sin parmetros. Pero hay ocasiones en las que nos puede interesar que no exista un constructor sin parmetros, por ejemplo, podemos crear una clase Cliente que solo se pueda instanciar si le pasamos, por ejemplo el nmero de identificacin 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 parmetros, C# no lo crea automticamente sin parmetros. Por tanto, si definimos un constructor con parmetros en una clase y queremos que tambin tenga uno sin parmetros, lo tenemos que definir nosotros mismos, aunque no es necesario que el constructor sin parmetros ejecute cdigo, puede estar declarado sin ms.

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, tambin 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 carcter ~ y no puede tener ningn modificador de visibilidad. Y solo es necesario definirlo si nuestra clase utiliza algn tipo de recurso, por tanto no es necesario definirlo si no tenemos que liberar expresamente algn recurso asignado en el constructor. La definicin del destructor de nuestra clase Cliente poda ser algo como esto:
~Cliente() { }

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.

Das könnte Ihnen auch gefallen