martes, 15 de diciembre de 2009

Curso de Programación C #: Metodos, Manejo de Excepciones

Métodos
Los métodos son miembros de las clases y pueden realizar una serie de acciones, o devolver un valor ya sea que tengan que calcularlo o no. Pueden recibir o no parametros y pueden devolver o no devolver parametros.
+ Declaración:
tipoRetorno + NombreDelMétodo + [Parámetros] + { cuerpo }
+ Ejemplo:
int Suma(int numero1, int numero 2)
{
return numero1 + numero2;
}
+ Uso:
[valor de retorno] miMétodo([Parametros]);
+ Ejemplo:
resultado = Suma(numero1,numero2);
Los métodos pueden recibir diversos valores desde el exterior, de hecho pueden recibir tantos valores como sea necesario, los valores que se le pasan a un método pueden ser por valor o por referencia, los valores que un método recibe por valor, los recibe como una copia del dato que puede modificar a su gusto sin que se vean afectadas las demás copias de dicho dato, en cambio los valores que un método recibe por referencia son las direcciones a donde se encuentra el dato, al cambiar el dato que ahí donde una de estas referencias apunta cambia el valor para todos aquellos que lo estan utilizando, un ejemplo muy sencillo de esto es, en el mundo real un paso de valor por referencia se da si tenemos apuntada la dirección de un amigo, dicha dirección es una referencia al lugar donde vive, es por eso que si vamos al lugar donde apunta la referencia nos encontraremos en la casa de nuestro amigo, una vez allí, si rompemos un vidrio cualquier persona que llegue a ese lugar encontrara la ventana rota, en cambio con los pasos de parámetro por valor se tiene una copia del objeto en si, es decir, en el ejemplo anterior en vez de haber tenido una dirección, habría tenido una casa exactamente igual a la de mi amigo, por lo que si hubiera roto un vidrio, solo mi casa se habría visto afectada. En C# si pasamos un valor a un método se pasa por valor a menos que se le indique lo contrario. Debemos recordar que no ahi limite al número de parámetros que puede recibir o devolver un método pero si no se va a recibir o a devolver ningún valor se puede usar la palabra void para indicarlo. En C# los métodos son sumamente flexibles, es por esto que podemos devolver múltiples valores y nos permite sobrecargarlos, las palabras claves ref y out son las que nos permiten que un método retorne más de un valor al método que lo invoco. La sobrecarga de métodos nos permite que un método se comporte de manera diferente en función al tipo de parametros que recibe y/o del número de argumentos que le acompañan. Ejemplos de sobrecarga de métodos:
int i1=2,i2=3;
float f1=2.14,f2=5.25;
int suma( int n1, int n2 ) //Método 1
{
return n1+n2;
}
float suma( float n1, float n2 ) //Método 2
{
return n1+n2;
}
float suma( int n1, float n2 ) //Método 3
{
return n1+n2;
}
resultado = suma(i1+i2); //Llamada 1
resultado = suma(f1+f2); //Llamada 2
resultado = suma(i1+f1); //Llamada 3
En este ejemplo en ninguno de los casos ahi perdida de precisión debido a que el método haciendo uso de la sobrecarga se adapta a los parametros que recibe y actúa en consecuencia a ello, es decir si el método suma recibe dos enteros como en la llamada 1 devuelve un número entero empleando para ello el método 1, si recibe dos flotantes devuelve un flotante utilizando para ello el método 2 y si recibe primero un flotante y luego un entero responde utilizando el método 3.

Manejo de Excepciones
C# proporciona soporte integrado para el manejo de excepciones o de una forma más formal situaciones anómalas de funcionamiento, las cuales pueden ocurrir en cualquier momento durante la ejecución del programa y son manejadas por el código que se encuentra fuera del flujo normal de control. Todo esto gracias a las palabras clave try, throw, catch y finally. C# proporciona una solución estructurada tanto a nivel del sistema como de aplicación. A pesar de que es muy similar a C++ en cuanto al manejo de excepciones existen varias diferencias, entre ellas que cada excepción esta representada por una instancia de un tipo de clase derivado de System.Exception. en realidad es algo bastante simple:
try
{
has esto...
si i = 0 throw una excepción
}
catch
{
si fallo has esto...
}
finally
{
haya fallado o no, has esto...
}
Como se puede apreciar el manejo de excepciones es bastante sencillo y fácil de entender aunque no tengamos mucha experiencia programando, todo aquello que se puso entre las {} del try es un segmento de código en el que puede o no generarse un error en tiempo de ejecución(excepción), en caso de que haya habido un funcionamiento anómalo en el programa(excepción) la ejecución del código entra en el segmento de código catch y ejecuta el bloque de instrucciones que hemos definido para manejar ese error, finalmente el flujo del programa haya o no habido excepción entra en finally aqui podemos poner rutinas para marcar los objetos que ya no se utilizarán de manera que el recolector de basura pueda liberar la memoria que dichos objetos ocupaban, rutinas que guarden un log de la aplicación para llevar un control de ¿cuántas veces ha fallado?, ¿porqué fallo?, etc., todo bloque try puede tener uno o más catch para tratar cada una de las posibles excepciones, pero la flexibilidad de C# va más alla de eso, ya que nos permite lanzar nuestras propias excepciones, por ejemplo si un método no recibe un valor que debe recibir o recibe un valor que no puede procesar podemos lanzar nuestra propia excepción. Ejemplo:
using System;
public class ManejoExcepciones
{
public static void Main()
{
try //Le hacemos saber que puede ocurrir un error
{
string s=null; //Declaramos un string y lo dejamos vacio
if (s == null) //Si el string esta vacio
throw(new ExcepcionCadenaVacia()); //Lanzamos un error personalizado
Console.WriteLine("Esto nunca se imprime"); //Si ahi error el código sale de la ejecución normal
//es por eso que esta parte nunca se ejecuta
}
catch( ExcepcionCadenaVacia e ) //Atrapamos nuestro error
{
Console.WriteLine("La cadena esta vacia"); //Manejamos el error
}
finally
{
Console.WriteLine("Esto siempre se imprime"); //Esto siempre se ejecutará
}
}
}
NOTA IMPORTANTE: El código que se encuentra en los capitulos del curso no es siempre funcional. Para código funcional consulte la sección de ejercicios resueltos.

No hay comentarios:

Publicar un comentario