C# - Fundamentos
C# - Fundamentos
C# - Fundamentos
Fundamentos de C#
Tema 3
Fundamentos de C#
3.1 Introduccin.
Como describe el ttulo del tema, se expondr a continuacin una introduccin a C#. Operaciones de definicin de variables, asignar y mostrar valores, presentar resultados, manejo de operadores, definicin de mtodos sern los conceptos a tratar. Tambin se mostrar la estructura fundamental de un programa en C#. Todos estos elementos se irn a su vez ampliando en el resto de captulos del curso.
3.2 Variables.
Los programas, para trabajar con datos, necesitan almacenarlos en la memoria y tener la oportunidad de acceder a sus valores para leerlos o modificarlos. Una variable representa un espacio de memoria para almacenar un valor de un determinado tipo. Normalmente, a medida que se ejecuta un programa, esos valores sern modificados desde unos valores iniciales a otros finales, por lo que ser necesario el poder acceder al espacio de memoria que representa una variable para leer o recuperar el valor que almacena y/o modificarlo. A nivel de lenguaje, la declaracin de una variable consiste en dar un nombre o identificador al espacio de memoria que representa y asociarle un tipo. El tipo representa un conjunto o rango de valores posibles. Bsicamente la declaracin de una variable se realiza dentro de un bloque. Un bloque queda definido por el cdigo que queda encerrado entre llaves {}. Las variables son accesibles, es decir podemos usarlas, slo dentro del bloque en que han sido declaradas. Ejemplo:
class Ejemplo31 { public static void Main(string[] args) { int a; // podr almacenar nmeros enteros double d, e; // podrn almacenar nmeros reales // . . . } // . . . }
Las variables a, d, e han sido declaradas dentro del bloque que define el mtodo Main. Esto implica que slo sern accesibles dentro del bloque Main de la clase Ejemplo31. En este caso se dice que las variables son locales al bloque donde han sido declaradas. Esto es lo que se conoce como mbito (espacio de programa al que queda limitado) local. Las variables locales se crean y tienen valor desde el punto de su declaracin hasta que termina el bloque en que han sido declaradas. Es importante que cada variable local tenga un identificador o nombre distinto, de esta forma podemos diferenciar unas de otras. Las variables locales no son iniciadas a ningn valor. Es obligacin del programador asignarle valores para poder operar con ellas; en caso contrario el compilador nos avisar del error en todas las sentencias que las utilicen. Las variables que se declaran fuera de los mtodos, se denominan variables miembro o atributos de la clase. Estas variables que se declaran dentro del bloque de una clase pero fuera de cualquier mtodo tienen mbito de clase; es decir son accesibles por todo el cdigo de la clase. Importante: no se pueden definir variables fuera de una clase.
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
Las variables miembro s son iniciadas por el compilador. Los valores iniciales depende del tipo, y tomarn el valor cero si son de tipo numrico, false (falso) si son tipo bool o null si son referencias. Los tipo en C# se clasifican en tipos valor y tipos referencia. Una variable de tipo valor almacena directamente un valor (datos en general), mientras que una variable tipo referencia lo que permite almacenar es una referencia a un objeto (posicin de memoria de un objeto). Por ejemplo, los nmeros son tipos valor; las cadenas de caracteres son tipos referencia Veamos un ejemplo de cdigo que nos aclare:
class Ejemplo32 { public static void Main(string[] args) { int a = 2, b = 3, r; string s = Vamos a sumar; // referencia al lugar donde se almacena // la cadena System.Console.WriteLine(s); r = a + b; System.Console.WriteLine({0} + {1} = {2}, a, b, r); Escribir(); } public static void Escribir() { string s; // variable de tipo string. Es tipo referencia s = Esto es todo...; // cambia la referencia a otro lugar System.Console.WriteLine(s); // escribe la cadena referenciada } }
La clase Ejemplo32 define dos mtodos. El mtodo Main() es el mtodo de entrada, es decir el mtodo que empieza a ejecutarse. El mtodo Escribir() se ejecutar cuando sea invocado. Las variables a, b, r y s son locales al bloque del mtodo Main() . Las dos primeras han sido declaradas e iniciadas. La variable r no tiene ningn valor inicial, aunque posteriormente se le asigna el resultado de evaluar la expresin de la suma de los contenidos de las variables a y b. Estas tres variable numricas son de tipo valor, por lo que ellas mismas almacenarn los valores. La variable s es de tipo string. Los tipos string son objetos de una clase definida en la BCL que permiten almacenar y manipular cadenas de caracteres Todos los objetos son tipos referencia; en nuestro caso el objeto s de tipo string almacenar la posicin de memoria donde el compilador almacene la cadena de caracteres Vamos a sumar. Posteriormente se invoca al mtodo WriteLine() pasndole como argumento la referencia de la cadena que debe presentar por pantalla. Despus de evaluar la expresin aritmtica, la variable r almacenar el valor 5. A continuacin vemos otra llamada al mtodo WriteLine() pero con un argumento de diferente aspecto. El mtodo WriteLine() necesita como argumento una cadena, cuyo contenido es lo que aparecer por pantalla. En este caso el mtodo construye por as decirlo la cadena. La expresin que est entrecomillada {0} + {1} = {2}, sera en principio la cadena a mostrar, pero no est completamente construida. Este formato de nmeros encerrado entre llaves hace que se vayan sustituyendo las llaves por los valores de las variables que aparecen a continuacin en el orden que indiquen los nmeros que estn entre las llaves. En este caso {0} sustituye al valor de la primera variable de la lista, la a, que es 2; {1} se sustituye por 3, y {2} por 5. Al final el mtodo WriteLine() usa como argumento la cadena 2 + 3 = 5, que es lo que se presentar por pantalla. Finalmente se invoca al mtodo Escribir(). En este mtodo se declara una nueva variable de nombre s. Esta variable no tiene nada que ver con la declarada en Main(), cada una pertenece a su mbito particular y son dos variables distintas. Posteriormente le asignamos la referencia donde el compilador tenga almacenada la cadena Eso es todo.... La llamada al mtodo WriteLine() produce la presentacin en pantalla de esta nueva cadena. Terminado de ejecutar el mtodo, la secuencia de ejecucin vuelve al lugar de donde se invoc. Como no queda nada que ejecutar del mtodo Main(), se acaba la ejecucin del programa y se retorna al control al sistema operativo.
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
3.3 Tipos.
El tipo de una variable depender de lo que vaya a almacenar. Como hemos comentado, el trmino tipo por valor indica que las variables de esos tipos contienen directamente sus valores. Los tipos por valor tambin se conocen como tipos primitivos. Cuando se declaran variables, normalmente usamos un alias para referirnos a su tipo. C# dispone de estos alias para que se asemejen a los tipos que se utilizan en otros lenguajes. La tabla siguiente muestra los tipos disponibles Tabla 2-1. Tipos por valor Alias byte sbyte short ushort int uint long ulong float double decimal char bool Tipo C# System.Byte System.SByte System.Int16 System.Uint16 System.Int32 System.Uint32 System.Int64 System.Uint64 System.Single System.Double System.Decimal System.Char System.Boolean Signo? Bytes No Si Si No Si No Si No Si Si Si 1 1 2 2 4 4 8 8 4 8 12 2 1 Rango 0 hasta 255 -128 hasta 127 -32.768 hasta 32.767 0 hasta 65535 -2.147.483.648 hasta2.147.483.647 0 hasta 4.394.967.395 -9.223.372.036.854.775.808 hasta 9.223.372.036.854.775.807 0 hasta 18446744073709551615 Aproximadamente 1.5E-45 hasta 3.4E38 con 7 cifras significativas Aproximadamente 5.0E-324 hasta 1.7E308 con 15 cifras significativas Aproximadamente 1.0E-28 hasta 7.9E28 con 28 cifras significativas Cualquier carcter Unicode (16 bits) verdadero o falso
No
3.3.1. Enteros
Los tipos que sirven para almacenar nmeros enteros son: byte, sbyte. short, ushort, int, uint, long y ulong. Como se aprecia en la tabla, C# define versiones con y sin signo para tipos con los mismo bytes utilizados. La diferencia entre enteros con signo y sin signo radica en el modo de interpretar el bit de nivel superior del entero. Si se especifica un entero con signo, el compilador entender que el primer bit indica el signo: 0 si es positivo, 1 si es negativo. Sin embargo, los enteros sin signo, ese bit se puede utilizar para almacen el nmero y as se consigue que los enteros sin signo puedan almacenar nmeros el doble de grandes que los enteros con signo. El siguiente ejemplo muestra la declaracin y uso de algunos tipos enteros calculando el nmero de segundos en una hora, en un da y en un ao.
class Enteros { public static void Main() { int minuto = 60; //segundos por minuto int hora = minuto*60; int dia = hora*24; long Ao = dia*365; System.Console.WriteLine("Segundos en un dia: {0}", dia); System.Console.WriteLine("Segundos en un ao: {0}", ao); } }
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
Los tipos de coma flotante sirven para representar a nmeros con parte fraccionaria. La representacin por supuesto puede no ser exacta, bien por errores de la mquina, bien porque el nmero de decimales que se puede alojar es finito. Existen dos clases de tipos de punto flotante, float y double. De los dos, el ms usado es double, pues es el valor que devuelven la mayora de las funciones matemticas de la biblioteca base. Cuando a una variable se le quiere asignar una constante de tipo float deberemos aadirle al final la letra f o F, de lo contrario se considera de tipo double. Tambin se puede usar la notacin cientfica (mantisa, exponente) par asignar valores a las variables de tipo flotante. El siguiente ejemplo calcula la raz cuadrada y el logaritmo de dos:
class Flotante { public static void Main() { int a = 2; double b = 2; double r = 2.34E+05; double log2 = System.Math.Log(a); double raiz2 = System.Math.Sqrt(b); System.Console.WriteLine("El logaritmo de dos es {0}", log2 ); System.Console.WriteLine("La raz de dos es {0}", raiz2 ); } }
Si intentamos cambiar el tipo de log2 a otro de menos precisin, como float o int, el compilador protestar. Esto se debe, como hemos dicho a que el valor devuelto por los mtodos matemticos es de tipo double y si se quiere convertir a float, pues se perdern datos.
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
char letra = A;
No confundir la constante carcter A con la cadena de caracteres A. El primer tipo es un tipo primitivo y se almacena por valor; el segundo es un tipo referencia.
Esta sentencia evala la expresin que aparece a la derecha del operador de asignacin, y el valor obtenido se asigna a la variable de la izquierda. De todos los operadores de asignacin, el operador = es el ms usual. Por ejemplo:
suma = valor1 + valor2;
Cuando a una variable de tipo valor se le asigna un valor, el contenido previo que almacenara desaparece y se sustituye por el nuevo. Recordar que las cadenas de caracteres son objetos de la clase string y se almacenan por referencia. Esto implica que si a un objeto string estuviera referenciando a una cadena de caracteres y posteriormente se le asigna otra cadena, la referencia de la primera cadena se pierde, ya que ahora el objeto string referencia a la nueva cadena.. Ejemplo:
class Ejemplo33 { static void Main(string[] args) { int a, b, suma; a = 12; b = 8; string s1 = "Hola"; suma = a + b; System.Console.WriteLine(s1); System.Console.WriteLine("La suma es " + suma); suma = suma + 15; System.Console.WriteLine("Ahora la suma es " + suma); s1 = "Adis"; System.Console.WriteLine(s1); } }
El ejemplo muestra como es posible acumular el contenido de una variable con un nuevo valor. As al valor inicial de 20 para suma se le acumula el valor 15, el resultado final de la expresin es 35, valor que se asigna a la variable. Tambin podemos observar en las sentencias que presentan los valores de suma, una nueva manera de usar el mtodo WriteLine(). Se coment que este mtodo necesita como argumento la cadena que se quiere presentar por pantalla. En nuestro caso en el cdigo aparece una expresin como la siguiente:
"La suma es " + suma
En este caso el compilador intentara sumar una cadena de caracteres con un valor. Como esto no es posible por que no son tipos compatibles, lo que hace de forma automtica es convertir el valor de la variable
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
suma en objeto string que referencie a una cadena cuyo contenido sea igual a los dgitos que almacena la variable suma; es decir construye una cadena de contenido 20. Ahora lo que se tiene son dos cadenas de caracteres unidos por el operador +. En la clase string se definen muchos mtodos y operadores, en particular el operador +. Este operador se ha definido de forma que la suma de dos cadenas produzca la concatenacin de ambas, es decir, se construye una nueva cadena cuyo contenido est formado por los caracteres de ambas. El resultado final es la cadena La suma es 20. sta es la cadena que usa el mtodo WriteLine() como argumento, y por lo tanto es lo que presenta en pantalla.
El mtodo Main() es pblico, esttico, no devuelve nada y tiene un argumento de tipo string[] que almacenar los argumentos pasados desde la lnea de rdenes cuando se invoca al programa para su ejecucin.
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
{ double a = 10; float b = 20; int c = 2; double r1; int r2; r1 = 7.5 * System.Math.Sqrt(a) - b / r2 = (int)(7.5 * System.Math.Sqrt(a) System.Console.WriteLine(r1); // System.Console.WriteLine(r2); // } }
c; - b / c); 13,7170824512628 13
En el ejemplo, primero se calcula la raz cuadrada de a, el resultado, de tipo double, se multiplica por 7.5 que tambin es de tipo double. Despus se evala b/c . Para ello previamente se convierte el tipo de c que es int al tipo de b que es de tipo float. El resultado es de tipo float. Finalmente se hace la resta de los dos resultados anteriores convirtiendo previamente el resultado de tipo float a tipo double. El resultado, de tipo double se asigna r1 que es del mismo tipo. La instruccin siguiente calcula la misma expresin, pero es convertida de forma explcita a tipo int para que se pueda asignar a r2. Si no forzramos la conversin, el compilador nos dara el mensaje de error: C:\Datos\DT\Ciclo\Ple-2006\Temas\Ejemplo34\Ejemplo34.cs(13): No se puede convertir implcitamente el tipo 'double' a 'int' En este caso la conversin explcita hace que se pierda la informacin correspondiente a la parte fraccionaria del resultado.
Cuando se ejecuta una sentencia if, se evala la expresin condicional. Si el resultado es verdadero (true), se ejecuta sentencia, en caso contrario (false), no se ejecuta. La llamada sentencia puede ser una sentencia simple, o una sentencia compuesta (grupo de sentencias encerradas entre llaves constituyendo un bloque). El siguiente cdigo nos dira si el resultado de una expresin aritmtica es par presentando un mensaje, y termina presentando el valor de la expresin.
class Ejemplo35 { static void Main(string[] args) { int a = 18; double r; r = a / 4; if (r % 2 == 0) System.Console.WriteLine(El resultado es par); System.Console.WriteLine(r); } }
La sentencia if del ejemplo comprueba si el resto de la divisin entera del valor de r entre 2 es igual a cero. Si es cierto, se invoca al mtodo WriteLine() y se presenta la cadena El resultado es par; si es falso, no
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
hace lo anterior. En cualquiera de los dos casos se contina con la siguiente sentencia que presenta por pantalla el contenido de la variable r. El resultado de evaluar una expresin condicional es siempre un valor de tipo bool. Los operadores relacionales son < (menor), <= (menor o igual), > (mayor), >= (mayor o igual), != (distinto), == (igual). Todos ellos tienen la misma prioridad. Hay una versin ms completa de la sentencia if , la llamada condicional compuesta. Su formato es:
if (expresin condicional) sentencia1; else sentencia2;
En este caso, si la expresin condicional se evala como true, se ejecuta sentencia1, en caso contrario se ejecuta sentencia2. Las sentencias que aparecen en el formato anterior pueden ser sentencias simples (una nica sentencia) o compuestas. Modifiquemos el ejemplo anterior:
class Ejemplo36 { static void Main(string[] args) { int a = 18; double r; r = a / 4; if (r % 2 == 0) { System.Console.WriteLine(El resultado es par); System.Console.WriteLine(r); } else { System.Console.WriteLine(El resultado es impar); System.Console.WriteLine(r); } } }
Vemos como las sentencias del bloque if y del bloque else son compuestas. El ejemplo se puede simplificar escribiendo menos cdigo. Vemos que la sentencia que presenta por pantalla el resultado almacenado en r se ejecuta siempre, ya que aparece tanto en el bloque if como en el else. Por lo tanto podemos trasladarla a continuacin de la sentencia if como la instruccin siguiente a ejecutar.
. . . if (r % 2 == 0) System.Console.WriteLine(El resultado es par); else System.Console.WriteLine(El resultado es impar); System.Console.WriteLine(r);
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
error estndar. Estos flujos se asocian a la consola (son abiertos) de forma automtica cuando se inicia una aplicacin de consola, y se presentan al usuario como las propiedades In, Out y Error de la clase Console. Estos tres flujos no tiene que asociarlos el programador. Cuando una aplicacin de consola se ejecuta, se abren de forma automtica Por defecto, el flujo de entrada estndar (In) est asociado al teclado. Dos mtodos de la clase Console estn definidos para leer datos de la entrada estndar:
public static int Read() public static string ReadLine() // lee slo un carcter del teclado // lee una lnea del teclado
El mtodo Read() lee del teclado el siguiente carcter disponible. Devuelve un entero int correspondiente al cdigo del carcter ledo, o un nmero negativo si no hay ms datos en el flujo. Ejemplo:
char respuesta = (char) System.Console.Read();
El carcter ledo del teclado debe convertirse de forma explcita a tipo char si queremos almacenarlo en una variable de tipo char. El mtodo ReadLine() lee del teclado la siguiente lnea disponible. Una lnea es una secuencia de caracteres que termina con el carcter \r, con el carcter \n o con ambos. Devuelve una referencia a un objeto string que envuelve la lnea leda, o el valor null si no hay datos disponibles. Para leer datos numricos debemos convertir la cadena que devuelve ReadLine() en alguno de los tipos primitivos. Para ello podemos usar los mtodos estticos de la clase Convert, del espacio de nombres System, o el mtodo Parse() de las estructuras que encapsulan los tipos primitivos. Ejemplo:
string s; int num1; double num2; s = Console.ReadLine(); num1 = Convert.ToInt32(s); num2 = Double.Parse(s);
En este ejemplo el mtodo ToInt32() permite convertir el argumento que encierre entre parntesis en un nmero entero de 32 bits, es decir a tipo int. Otros mtodos de la clase Convert son ToByte, ToInt16, ToInt32, ToInt64, ToSingle, ToDouble, ToString, los cuales permiten realizar conversiones a cada uno de los tipos primitivos. Aunque se estudiar ms adelante, podemos adelantar que en el espacio de nombres System estn disponibles las estructuras Byte, Sbyte, Char, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal y Boolean que encapsulan cada uno de los tipos primitivos. Una estructura es como una clase, pero de tipo valor en lugar de tipo referencia. Por ejemplo, un objeto de la estructura Int32, encapsula un nmero entero (dato tipo int). Todas estas estructuras disponen de una serie de campos y mtodos que podemos usar. Entre stos estn los mtodos:
public static tipo Parse(string); public override string ToString();
El mtodo Parse() intenta convertir un string en una representacin de otro tipo. Usa como argumento un string y retorna un valor de tipo igual al de la estructura que invoca el mtodo. As, el mtodo Double.Parse() retorna un tipo double, y el mtodo Int64.Parse() un tipo long. Ejemplo:
int k1 = Int32.Parse(126); // k1 almacena el numero entero 126 string pi = 3.1415926; double num_pi = Double.Parse(pi); // num_pi almacena el real 3.1315926
El mtodo ToString() est redefinido en estas estructuras de forma que aplicado a tipos numricos retorne una representacin en formato cadena de dicho nmero: Por ejemplo:
string s1 = 43.ToString(); double d = 12.56;
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
string s2 = d.ToString();
Los string s1 y s2 contendrn respectivamente las cadenas 43 y 12.56. Por otro lado, en toda aplicacin de consola tenemos disponible el flujo de salida estndar (Out) asociado al monitor. Dos mtodos de la clase Console estn definidos para escribir datos de la salida estndar:
public static void Write([argumento]); public static void WriteLine([argumento]);
Ambos mtodos escriben su argumento en el flujo de salida. La diferencia es que WriteLine() aade un carcter \n (avance de lnea) al final de su salida, y Write() no. Los argumentos pueden ser de cualquier tipo primitivo o referenciado. Si se usa sin argumento, el efecto es escribir un carcter \n. Los mtodos Write() y WriteLine() permiten mostrar los datos segn un formato. Para ello se utilizan las siguientes definiciones para los mtodos:
public static void Write(formato [, argumento]); public static void WriteLine(formato[, argumento]);
La cadena de formato permite especificar como va ser la salida. Es una cadena de caracteres formada por caracteres ordinarios, secuencias de escape y especificaciones de formato. Las secuencias de escape se forman por una letra precedida por el carcter \ que permiten representar caracteres no visibles. El formato se lee de izquierda a derecha. Ejemplo:
int edad = 21; double peso = 71,3; Write(\tTiene {0,2:d} aos y pesa {1,6:f2} Kg \n, edad, peso);
El argumento representa el valor o valores a escribir. Cada argumento debe tener su correspondiente especificacin de formato. Esta correspondencia se establece en parejas y en el mismo orden en que aparecen en la expresin. Si hay ms argumentos que especificaciones de formato, los argumentos en exceso se ignoran y no aparecen en la salida. En el ejemplo anterior, los caracteres ordinarios se escribirn tal cual, las especificaciones de formato sern sustituidas por los valores correspondientes en la lista de argumentos y las secuencias de escape darn lugar a las acciones que representan. Una especificacin de formato est compuesta por:
{posicin [,ancho] [:tipo[decimales]]}
posicin: indica la posicin (0,1,2, etc) del argumento correspondiente de la lnea de argumentos. ancho: opcional. Mnimo nmero de posiciones para la salida. Si el ancho se omite o el valor a escribir ocupa ms posiciones de las especificadas, el ancho es incrementado en lo necesario. Si este valor es negativo, el resultado se ajusta a la izquierda, dentro del ancho especificado. tipo: opcional. Es uno de los caracteres de la tabla posterior y permite establecer el tipo del argumento.
decimales: opcional. Mnimo nmero de dgitos a mostrar en caso de valores enteros, o de decimales en caso de valores reales. Veamos los formatos con algunos ejemplos:
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
11
Carcter C D E F
G N P X
Ejemplo Write({0,9:C2},-4.5) Write({0:D5},45) Write({0:E},450000) Write({0:F2},45) Write({0:F0},45) Write({0,8:F2},45) Write({0,8:F2},145.3) Write({0:G},4.5) Write({0:N},4500000) Write({0:P},0.12345) Write({0:X},0xFF7A) Write({0:X},450)
Salida -4,50 00045 4,500000E+005 45,00 45 45,00 145,3 4,5 4.500.000,00 12,35% FF7A 1C2
Los modificadores los estudiaremos en otros temas, por ahora usaremos public static en nuestra definicin. El tipo de retorno sirve para indicar el tipo del resultado que va a devolver el mtodo. Si no va a devolver nada, se usa la palabra reservada void. El nombre del mtodo es el identificador que usaremos para invocarlo. La lista de parmetros es una lista de variables con sus tipos separadas por comas. Los parmetros se usan para pasar datos al mtodo con los que trabajar. Si no hay que enviar valores, no habr lista de parmetros, aunque los parntesis deben mantenerse. Los parmetros son variables locales al mtodo, por lo que slo sern accesibles dentro del mtodo. Cada vez que se realice una llamada al mtodo los parmetros se crean; y se destruirn cuando acabe la ejecucin del mtodo. La sentencia return es opcional. Si existe, provoca que se termine la ejecucin del mtodo y el control es devuelto al mtodo que hizo la llamada, aunque queden sentencias por ejecutar en el mtodo invocado. La expresin que le puede acompaar tambin es opcional. Si existe, se evala la expresin y el valor obtenido se usa como valor de retorno. Si no existe la sentencia return, el control vuelve al mtodo que hizo la llamada cuando se acaben de ejecutar todas las sentencias del mtodo invocado. Pueden existir varias sentencias return, aunque lgicamente solamente una de ellas se ejecutar provocando el retorno. Para invocar a un mtodo se usa el formato siguiente:
espacio_de_nombres.clase.nombre_mtodo(parmetros);
Si en nuestro programa no se define un espacio de nombres, que es lo que hemos hecho hasta ahora, no es necesario escribir ninguno en la llamada del mtodo. Como veremos en otro tema, si el programador no define un espacio de nombres, el compilador define uno por defecto, y todas las clases que definamos en el programa pertenecern a este espacio de nombres por defecto. Si el mtodo que hemos definido y el mtodo de donde se invoca pertenecen a la misma clase, tampoco es necesario anteponer el nombre de la clase en la llamada, ya que comparten la misma clase. En la llamada, deben aparecer entre los parntesis tantos valores como nmero de parmetros se hayan
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
especificado en la definicin del mtodo. Adems deben coincidir en el tipo, o por lo menos que se puedan convertir de forma implcita. Estos valores pueden expresarse directamente mediante constantes o mediante los contenidos de variables. Cuando se invoca al mtodo, los valores que aparecen en la llamada se copian uno a uno, y en el mismo orden, en los parmetros definidos en el mtodo. Esta es la forma de pasar datos a un mtodo. Veamos un ejemplo. Supongamos que queremos definir un mtodo que sea capaz de calcular la suma o la resta de dos nmeros reales, y retornar el resultado. Para ello definimos un mtodo de nombre Calcular() que recibir tres parmetros. El primero, de tipo char, recibir el tipo de operacin a realizar. Los valores permitidos sern el carcter + o el carcter -. Los dos parmetros restantes, de tipo double, recibirn los valores que hay que sumar o restar. El resultado de la operacin, de tipo double, es el valor a retornar. En el cuerpo del mtodo se declara una variable de nombre res que se usar para almacenar el valor de la expresin de suma o resta y cuyo valor se devolver. A continuacin se determina cul es valor del parmetro que recibe el tipo de operacin. Dependiendo del resultado obtenido al evaluar las expresiones condicionales, se realizarn las operaciones correspondientes. Vemos que si el tipo de operacin no se corresponde con la suma o la resta, la variable res toma el valor System.Double.MaxValue. Este valor es una constante definida cuyo valor es el ms grande que se puede representar de tipo double. Este valor es tan descomunalmente grande, que ninguna expresin aritmtica normal llegar a tomar. Finalmente la sentencia return devuelve el valor que almacene res. En el mtodo Main(), se declaran la variables de tipo double v1 y r. La primera, iniciada al valor 4 la usaremos como primer operando; la segunda como variable que almacenar el valor de retorno que devuelva el mtodo Calcular(). La variable tipo_op est iniciada al valor + con la intencin inicial de hacer una operacin de suma. En la llamada al mtodo los valores (+, 4, 3) se copiarn en las variables definidas como parmetros (c, op1, op2), y ser con estos valores con los que el mtodo trabajar. Vemos como en la llamada podemos usar tanto variables, como constantes. En realidad se pueden usar expresiones en la llamada, las cuales se evaluaran y sus resultados seran los que se copiaran en los parmetros. Recordar que el mtodo recibe copias de los valores, por lo que la modificacin de stos que se pudieran realizar dentro del mtodo, no afectar a los valores originales. Como el mtodo tiene un valor de retorno, ste se aprovecha y se asigna a la variable r de Main(). Finalmente, si el valor devuelto por el mtodo es distinto de System.Double.MaxValue, se presenta en pantalla el resultado de la operacin; en caso contrario se presenta el mensaje de error. La salida que provoca la ejecucin del cdigo sera:
4 + 3 = 7 // Versin 1.0 class Ejemplo37 { public static void Main(string[] args) { double v1 = 4, r; char tipo_op = '+'; r = Calcular(tipo_op,v1,3); if (r != System.Double.MaxValue) System.Console.WriteLine("{0} {1} {2} = {3}",v1,tipo_op,3,r); else System.Console.WriteLine("La operacin no es vlida..."); System.Console.ReadLine(); }
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.
13
{ double res; if (c == '+') res = op1 + op2; else if (c == '-') res = op1 - op2; else res = System.Double.MaxValue; return res; } }
Carlos Martn Ruiz. Programacin en Lenguajes Estructurados IES Zaidn Vergeles de Granada. Departamento de Informtica. Desarrollo de Aplicaciones Informticas.