You are on page 1of 42

EL LENGUAJE C#

Introduccin
Los primeros rumores de que Microsoft estaba desarrollando un nuevo lenguaje de programacin surgieron en 1998, haciendo referencia a un lenguaje que entonces llamaban COOL y que decan era muy similar a Java. En junio de 2000, Microsoft despej todas las dudas liberando la especificacin de un nuevo lenguaje llamado C#. A esto le sigui rpidamente la primera versin de prueba del entorno de desarrollo estndar (SDK) .Net, que inclua un compilador de C#. El nuevo lenguaje estaba diseado por Anders Hejlsberg ( creador de Turbo Pascal y arquitecto de Delphi ), Scott Wiltamuth y Peter Golde. Entonces describieron el lenguaje como "...simple, moderno, orientado a objetos, de tipado seguro y con una fuerte herencia de C/C++".

Programacin basada en componentes


En los ltimos 10 aos se han asentado diferentes tcnicas de programacin como son la orientacin a objetos, la programacin basada en interfaces o los componentes. A pesar de sto, los lenguajes de programacin siempre han ido un paso por detrs de las mejores prcticas de programacin del momento. Como resultado, los programadores tienden a depender de cdigo especfico, usar convenciones, o simplemente a no usar las nuevas tcnicas. Por ejemplo, C++ soporta orientacin a objetos, pero no tiene el concepto formal de interfaces. Los programadores entonces recurren a clases abstractas para simular programacin basada en interfaces, mientras que utilizan modelos externos de componentes, como COM y CORBA para obtener los beneficios de la programacin orientada a componentes. Aunque Java est un paso adelante de C++ al proporcionar soporte a nivel de lenguaje para interfaces y paquetes (entre otras cosas), le sigue faltando soporte para construir y mantener a la largo del tiempo completos sistemas basados en componentes (en los que uno necesita desarrollar, desplegar, interconectar y manejar distintas versiones en un extenso periodo de tiempo). Esto no significa que la comunidad Java no haya construido tales sistemas, simplemente que las necesidades derivadas de la implementacin de tales sistemas se han conseguido a travs de convenciones de notacin y cdigo propio, no a travs de una caracterstica del lenguaje. Por otra parte, el lenguaje C# se ha construido suponiendo que los modernos sistemas de software se construyen usando componentes. Por lo tanto, C# proporciona soporte a nivel de lenguaje para los constructores bsicos de los componentes, como pueden ser propiedades,

mtodos y eventos. Esto no significa que todo esto no se haya hecho antes, lenguajes como LISP o Smalltak hacan cosas parecidas, pero con un gran coste. C# tiene mecanismos para permitir

al mismo tiempo un orientacin a componentes y un gran rendimiento.

Orientacin a objetos
Adems del soporte para desarrollo de software basado en componentes, C# es un lenguaje completamente orientado a objetos, que implementa casi todo los conceptos y abstracciones presentes en C++ y Java. Como es de esperar en un lenguaje orientado a objetos, C# implementa conceptos como herencia, encapsulacin, polimorfismo y programacin basada en interfaces. Adems soporta las construcciones tpicas de C++ y Java, como clases, estructuras, interfaces y enumeraciones, as como algunas construcciones nuevas, como los delegados, que son parecidos a los punteros a funciones de C++, o los atributos, lo cual permite aadir metainformacin al cdigo. C# consigue aunar orientacin a objetos y rendimiento. Algunos lenguajes, como Smalltalk, se basan en que "todo es un objetos". Esta aproximacin tiene la ventaja de una completa orientacin a objetos, pero tiene la desventaja de ser muy ineficiente. Para mejorar el rendimiento, otros lenguajes, como Java, separan el sistema de tipos en tipos primitivos y todo el resto, dando lugar a mejor rendimiento en los tipos primitivos, pero en una separacin a veces molesta entre tipos primitivos y tipos definidos por el usuario. En C# se han aunado ambas aproximaciones presentando lo que se llama un sistema unificado de tipos, en el que todos los tipos, incluso los primitivos, derivan de un tipo objeto comn, a la vez que permite el uso de optimizaciones para tipos primitivos.

Librera del lenguaje


Contrariamente a la mayora de lenguajes, C# no incluye una librera especfica, sino que utiliza la librera de clases de la plataforma .NET para todas sus necesidades, desde utilizacin de la consola hasta la programacin multihilo o el cifrado de seguridad. Estandarizacin Adems de los mritos tcnicos, uno de las razones del xito de C# y la plataforma .NET ha sido por el proceso de estandarizacin que Micrsoft ha seguido (y que ha sorprendido a ms de uno). Micrsoft, en lugar de reservarse todos los derechos sobre el lenguaje y la plataforma, ha publicado las especificaciones del lenguaje y de la plataforma, que han sido posteriormente revisadas y ratificadas por la Asociacin Europea de Fabricantes de Computadoras (ECMA). Esta especificacin permite la implementacin del lenguaje C# y de la plataforma .NET por terceros,

incluso en entornos distintos de Windows.

C# frente a Java
C# y Java son lenguajes similares, de sintaxis basada en C/C++, orientados a objetos, y ambos incluyen las caractersticas ms importantes de los lenguajes modernos, como son la gestin automtica de memoria y la compilacin a cdigo intermedio. Pero por supuesto, tambin hay diferencias. Una de las diferencias ms importantes es que C# es mucho ms cercano a C++ en cuanto a diseo se refiere. C# toma casi todos sus operadores, palabras reservadas y expresiones directamente de C++. Tambin se han mantenido algunas caractersticas que en Java se han desestimado. Por ejemplo las enumeraciones. No hay enumeraciones en Java y sin embargo era un concepto muy usado en C/C++. En C# se han mantenido las enumeraciones, y se han adaptado al nuevo lenguaje, de forma que ahora las enumeraciones no son simplemente enteros, sino que son tipos de tipado seguro que derivan de System.Enum en la librera de clases base. Una enumeracin de tipo "ej1" no se puede cambiar con una enumeracin de tipo "ej2" sin una conversin. Otra caracterstica que no est presente en Java es la posibilidad de trabajar directamente con direcciones de memoria. Si bien tanto Java como .NET proporcionan gestin automtica de memoria, en C# es posible usar lo que se denomina "cdigo no seguro". Cuando se usa cdigo no seguro en C# es posible operar con punteros de forma muy similar a como se hara en C/C++, pero el cdigo que utiliza punteros se queda marcado como no seguro y no se ejecuta en entornos en los que no tiene permisos.

C# frente a C++
Puesto que C# se ejecuta en una mquina virtual, sta se hace cargo de la gestin de memoria y por lo tanto el uso de punteros es mucho menos importante en C# que en C++. C# tambin es mucho ms orientado a objetos, hasta el punto de que todos los tipos usados derivan en ltima instancia el tipo 'object'. Adems, muchos tipos se usan de forma distinta. Por ejemplo, en C# se comprueban los lmites de los arrays antes de usarlos, evitando as que se pueda escribir pasado el final del vector. Al igual que Java, C# renuncia a la idea de herencia mltiple de clases presente en C++. Sin embargo, referido a clases, C# implemente 'propiedades' del tipo de las que existen en Visual Basic, y los mtodos de las clases son accedidos mediante '.' en lugar de '::'.

Porqu C#?
La plataforma .NET acepta varios lenguajes. Por ahora, C#, Visual Basic, C++ gestionado, Nemerle,

FORTRAN, Java, Python, etc. , y con capacidad para aceptar prcticamente cualquier lenguaje. Entonces la pregunta es, porqu se eligi C# en lugar de cualquier otro lenguaje?. La razn fundamental es que C# se dise para la plataforma .NET y es capaz de utilizar todo su potencial. Tambin es cierto que es un lenguaje "limpio" en el sentido de que al no tener que proporcionar compatibilidad hacia detrs se ha tenido ms libertad en el diseo y se ha puesto especial incapi en la simplicidad. Por ejemplo, en C# hay un tipo de clase y siempre se le aplica el recolector de basura mientras que en C++ gestionado hay dos tipos de clases, una a las que se le aplica el recolector y otra a la que no.

Primer ejemplo
Para empezar con C#, que mejor que con un ejemplo bsico para entender la estructura bsica de un programa en C# y empezar a conocer las caractersticas del lenguaje. El ejemplo sera el siguiente:
//Declaracin del espacio de nombres using System; //Clase de nuestro programa principal class PrimerEjemplo { public static void Main() { // Escribir a la consola Console.WriteLine ("Bienvenido al tutorial de C# de M-H"); } }

Todo programa que escribamos en C# va a tener una estructura similar a esta en la que declararemos uno/varios espacios de nombres a utilizar (System), una clase y el mtodo "Main" de esa clase con las sentencias de nuestro programa. Por cierto, todos los archivos en C# llevan la extensin .cs (no hay ficheros de cabecera ni nada similar). Una vez ya visto el primer ejemplo, para compilarlo habra que utilizar mcs (mono compiler suite), que es el compilador de mono de C#, implementado segn las especificaciones del lenguaje segn ECMA-334, que ser el encargado de generar los ejecutables en cdigo intermedio (CIL) que posteriormente tendr que ser ejecutado por mono. Para ello se procedera de la siguiente forma:

# mcs ejemplo.cs # mono ejemplo.exe

Dando el siguiente resultado:


Bienvenido al tutorial de C# de M-H

Sobre todo si ests en entornos Windows tal vez querrs que la consola no se cierre automticamente. Entonces tendrs que escribir Console.Read() detrs de la ltima sentencia para que el programa espere a que pulses una tecla para poder cerrarse. Esto se hace extensible a todos los ejemplos de este tutorial. En nuestro ejemplo, System es un espacio de nombres y con l le estaremos diciendo que podamos usar todos las clases asociadas a ese espacio de nombres, en nuestro caso la clase Console con el mtodo WriteLine que es el que se encarga de escribir por pantalla el mensaje que queramos mostrar. La clase PrimerEjemplo es la que va a contener la definicin de datos y mtodos que va a usar nuestro programa al ejecutarse. Adems de clases veremos que se pueden definir otros tipos diferentes de elementos tales como estructuras e interfaces con los mtodos asociados a estos tipos. Al utilizar el mtodo Main le estaremos diciendo que nuestro programa empieza ah y tiene los modificadores static (slo se va a usar en esa clase) y void diciendole que nuestro mtodo no va a devolver nada. Ya nicamente queda mostrar por pantalla el resultado, esto se hace utilizando la clase Console y el mtodo asociado WriteLine que es el que muestra por pantalla el mensaje de bienvenido. Para hacer referencia a los mtodos en WriteLine en C# se va a hacer con el operador ".", en diferencia a lo que puede ser en C++ el "::". Para los comentarios se utiliza tanto // como /* esto es un comentario */ al ms puro estilo de C++ y que todas las sentencias tienen que acabar con; y los delimitadores de bloque son { y }.

TIPOS DE DATOS
Importancia de los tipos de datos
Los tipos son la base de cualquier programa. Un tipo no es ms que un espacio en memoria en el que se almacena informacin, ya sean nmeros, palabras o tu fecha de nacimiento. Los tipos de datos son especialmente importantes en C# porque es un lenguaje con

informacin de tipos. Esto significa que, en todas las operaciones, el compilador comprueba los tipos para ver su compatibilidad. Las operaciones no vlidas no se compilan. De esta forma se evitan muchos errores y se consigue una mayor fiabilidad

Tipos en C#
En C# los tipos bsicos no son ms que sinnimos para tipos predefinidos en la librera base de la plataforma Mono/.NET . As, el tipo entero int, no es ms que un sinnimo de System.Int32 . Los tipos de C# estn divididos en dos grandes categoras: tipos por valor y tipos por referencia. Existe adems una tercera categora, los punteros (disponibles solo cuando se usa cdigo no seguro), que se discutirn ms adelante. Los tipos por valor difieren de los tipos por referencia en que las variables de los tipos por valor contienen directamente su valor, mientras que las variables de los tipos por referencia almacenan referencias a objetos. Con los tipos por referencia, es posible que dos variables se refieran al mismo objeto, y por tanto es posible que las operaciones sobre una variable afecten al objeto al que hace referencia otra variable. Con los tipos por valor, cada variable tienen su propia copia de los datos, y las operaciones sobre una no afectar a la otra.

Tipos por valor


Como hemos comentado, el trmino tipo por valor indica que las variables de esos tipos contienen directamente su valor. De esta forma, los tipos por valor actan de forma muy parecida a los tipos de datos de otros lenguajes de programacin como C++. Los tipos por valor se conocen tambin como tipos sencillos Tipos por valor Nombre para la plataforma bool C# Mono/.NET System.Boolean Tipo byte System.Byte sbyte System.SByte short System.Int16 ushort System.Uint16 int System.Int32 uint System.Uint32 Con Bytes

signo? utilizados verdadero o falso No 1 Rango No 1 0 hasta 255 Si 1 -128 hasta 127 Si 2 -32.768 hasta 32.767 No 2 0 hasta 65535 Si 4 -2.147.483.648 hasta 2.147.483.647 No 4 0 hasta 4.394.967.395

-9.223.372.036.854.775.808 long ulong System.Int64 System.Uint64 Si No 8 8 9.223.372.036.854.775.807

hasta

0 hasta 18446744073709551615 Approximadamente 1.5E-45 hasta

float

System.Single

Si

3.4E38 con 7 cifras significativas Approximadamente 5.0E-324 hasta 1.7E308 con 7 cifras

double

System.Double

Si

significativas Approximadamente 1.0E-28 hasta 7.9E28 con 28 29 cifras

decimal

System.Decimal

Si

12

significativas Cualquier carcter Unicode (16

char

System.Char

bits)

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 almacn el nmero y as se consigue que los enteros sin signo puedan almacenar nmeros el doble de grandes que los enteros con signo. Probablemente el tipo ms utilizado es el int, pues se utiliza para controlar matrices, iniciar arreglos adems de las operaciones normales con enteros. Adems, se trata de un entero de tamao medio: ms pequeo que long y ulong, pero ms grande que byte, sbyte, short y ushort. El siguiente ejemplo muestra la declaracin y uso de algunos tipos enteros calculando el nmero de segundos en una hora, da y en un ao.
using System; class Enteros{ public static void Main()

{ int Minuto = 60; //segundos por minuto

int Hora = Minuto*60; int Dia = Hora*24; long Anio = Dia*365; Console.WriteLine("Segundos en un dia: {0}", Dia); Console.WriteLine("Segundos en un ao: {0}", Anio); } }

De nuevo hemos usado el mtodo Console.WriteLine para imprimir los resultados por la consola. El identificador {0} dentro de la cadena de texto indica que se sustituye {0} por el primer argumento. si hubiera ms de un argumento, se seguira con {1}, y as sucesivamente. Por ejemplo, las dos lneas que utilizan Console.WriteLine se pueden simplificar as:
Console.WriteLine("En un dia: {0}; en un ao: {1}", Dia, Anio );

Tipos de coma flotante


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, pus es el valor que devuelven la mayora de las funciones matemticas de la librera base. El siguiente ejemplo calcula la raz cuadrada y el logaritmo de dos:
using System; class Flotante{ public static void Main() { int a = 2; double log2 = Math.Log(2); double raiz2 = Math.Sqrt(2);

Console.WriteLine("El logaritmo de dos es {0}", log2 ); Console.WriteLine("La raiz de dos es {0}", raiz2 ); } }

y la salida ser la siguiente:


El logaritmo de dos es 0.693147180559945 La raiz de dos es 1.4142135623731

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 Math.Log() es de tipo double y si se quiere convertir a float, pues se perdern datos. Lo mismo ocurre con la mayora de los miembros de la clase Math, como Math.Sin(), Math.Tan(), etc.

El tipo decimal
El tipo decimal es un tipo "nuevo" en el sentido de que no tiene equivalente en C/C++. Es muy parecido a los tipo de coma flotante float y double. En la aritmtica de los tipos de coma flotante ordinarios, se pueden producir leves errores de redondeo. El tipo decimal elimina estos errores y puede representar correctamente hasta 28 lugares decimales. Esta capacidad para representar valores decimales sin errores de redondeo lo hace especialmente eficaz para clculos monetarios.

El tipo bool
El tipo bool sirve para expresar los valores verdadero/falso, que en C# se muestran con las palabras reservadas true y false. En C#, por ejemplo, una instruccin if solo puede estar gobernada por un valor bool, no como en C/C++, que lo puede estar tambin por un entero. De esta forma se ayuda a eliminar el error tan frecuente en programadores de C/C++ cuando usa "=" en lugar de "==". En definitiva, la inclusin del tipo bool en el lenguaje ayuda a la claridad del cdigo y evita algunos errores muy comunes. El siguiente ejemplo, muestra algunos usos del tipo bool:
using System; class Booleano{

public static void Main() { bool b; b = true; Console.WriteLine("b es {0}", b); if(b) { Console.WriteLine("esto saldr"); } b = false; if(b) { Console.WriteLine("esto no saldr"); } Console.WriteLine("2==2 es {0}", 2==2); } }

En la ltima lnea se muesta que el operador "==" tambin devuele un valor booleano. El resultado debera ser el siguiente:
b es True

esto saldr 2==2 es True

Tipo arreglo
En C# se pueden construir arreglos de prcticamente cualquier tipo de dato. Los arreglos, tambin llamados vectores o arrays, no son ms que una sucesin de datos. Por ejemplo, el concepto matemtico de vector es una sucesin de nmeros y por lo tanto es un arreglo unidimensional. As, podemos construir arreglos de objetos, de cadenas de texto, y, por supuesto, arreglos de enteros:
using System;

class Arreglo{ public static void Main() { int[] arr = new int[3]; arr[0] = 1; arr[1] = 2; arr[2] = 3; Console.WriteLine( arr[1] ); } }

En este ejemplo se crea un arreglo arr unidimensional con capacidad para 3 enteros, y luego se le asigna a cada valor un entero distinto (ntese que se comienza a contar a partir de 0 ). Existe una forma ms corta para declarar el arreglo y asignarle las variables:
int[] arr = {1,2,3};

Tambin se pueden crear arreglos bidimensionales ( de la misma forma para ms dimensiones). En ese caso la sintaxis para declarar un arreglo bidimensional de enteros ser
int[,] arr

en contraposicin a C/C++, en el que se declarara como


int[][] arr

De esta forma, un arreglo bidimensional se declarara y utilizara de la siguiente forma:


using System; class Arreglo2{ public static void Main() { int[,] arr = new int[2,2]; arr[0,0] = 1; arr[1,0] = 2; arr[0,1] = 3; arr[1,1] = 4;

Console.WriteLine( arr[1,1] ); } }

que, igual que el ejemplo anterior, podamos hacer declarado todo el arreglo de la siguiente forma:
int[,] arr = {{1,2},{3,4}};

Se hablar con ms detalle sobre arreglos en la seccin

El tipo char
El tipo char permite almacenar un carcter en formato unicode de 16 bits, lo que nos garantiza que los acentos se ven de forma adecuada y adems permite la representacin de otros alfabetos, como el griego, cirlico, etc. Para introducir un carcter se utilizan comillas simples, de forma de declarar un carcter sigue la estructura

char letra = 'a'

De igual forma que hemos hecho con los enteros, es posible declarar un arreglo de char
char[] cadena = {'a', 'b', 'c' };

aunque para almacenar algunas cadenas de caracteres, como las palabras, es ms indicado usar el tipo string.

Estructuras de control
En este captulo se describen algunas sentencias que sirven para controlar la ejecucin de un programa. Algunas son muy similares a las existentes en otros lenguajes, como las sentencias if, for, while, etc. y otras, como foreach, throw o continue, son algo ms especficas.

Instruccin if
Esta sentencia sirve para ejecutar unas instrucciones en caso de que se cumpla determinada condicin. La forma completa de la instruccin if es
if( condicin ) {

instruccin1; instruccin2;

.. . } else { instruccin1; instruccin2; .. . }

donde la clusula else es opcional. Si la condicin es verdadera, se ejecutarn las instrucciones dentro del bloque if, mientras que si es falsa, se ejecutar el bloque else. El valor que controla la sentencia if debe ser de tipo bool. El siguiente ejemplo
//programa que determina si un valor es positivo o negativo using System; class InstruccionIf{ public static void Main() { double d; Console.WriteLine("Introduce un numero"); d = Double.Parse( Console.ReadLine() ); if( d>0 ) { Console.WriteLine("El numero {0} es positivo", d); } else { Console.WriteLine("El numero {0} es negativo", d); } }

te pide que introduzcas un nmero y dependiendo de si se cumple que dicho nmero es mayor que cero (condicin), se ejecuta un bloque u otro. La sentencia d = Double.Parse( Console.ReadLine() ); tal vez requiera algo de explicacin adicional. En realidad, con Console.ReadLine() estamos leyendo lo que el usuario introduce por pantalla, que es una cadena de caractres, y con Double.Parse lo que hacemos es interpretar esa cadena de caractres y conventirna en un tipo numrico double, de forma que d tendr el valor del nmero que introduzcamos por la consola. Las intrucciones if se pueden anidar, y existe tambin una extensin de la sentencia if, la sentencia if-else-if. Su formato es el siguiente:
if( condicion1 ) { instrucciones; } else if( condicion2 ) { instrucciones; } ... else { instrucciones; }

Las instrucciones condicionales se evalan de arriba a abajo. Tan pronto como se encuentra una condicin true, se ejecuta la instruccin asociada con ella, y el resto de la escalera se omite. Si ninguna de las condiciones es true, se ejecutar la ltima instruccin else. La ltima instruccin else acta como condicin predeterminada, es decir, si no funciona ninguna de las otras pruebas condicionales, se realiza esta ltima instruccin. Si no existe esta instruccin else final y el resto de las condiciones son falsas, entonces no se realizar ninguna accin. El siguiente ejemplo

using System; class IfElseIf{ public static void Main() { string opcion; Console.WriteLine("Elija una opcin (si/no)"); opcion = Console.ReadLine(); if( opcion=="si" ) { Console.WriteLine( "Muy bien, ha elegido si" ); } else if( opcion=="no" ) { Console.WriteLine( "Ha elegido no" ); } else{ Console.WriteLine("No entiendo lo que ha escrito"); } } }

le pide al usuario que elija una opcin si/no y la procesa usando una estructura if-else-if. Si la opcin no es ni "si" ni "no", entonces se ejecuta la sentencia else por defecto, que imprime por pantalla el mensaje "No entiendo lo que ha escrito"

Instruccin Switch
La instruccin switch es muy parecida a la estructura if-else-if, slo que permite seleccionar entre varias alternativas de una manera ms cmoda. Funciona de la siguiente manera: el valor de una expresin se prueba sucesivamente con una lista de constantes. Cuando se encuentra una coincidencia, se ejecuta la secuencia de instrucciones asociada con esa coincidencia. La forma general de la instruccin switch es la siguiente:

switch( expresin ){ case constante1: instrucciones; break; case constante2: instrucciones; break; ... default: instrucciones; break; }

La sentencia default se ejecutar slo si ninguna constante de las que siguen a case coincide con expresin. Es algo similar al else final de la instruccin if-ese-if. Sin ms, vamos a por un ejemplo
using System; class InstruccionSwitch{ public static void Main() { string s; Console.WriteLine( "Elige hacer algo con los nmeros 2 y 3"); Console.WriteLine( Console.WriteLine( Console.WriteLine( " entera)" ); s = Console.ReadLine(); switch(s){ case "+": Console.WriteLine("El resultado es {0}", 2+3); " " + para para sumarlos" restarlos" ); );

Console.WriteLine( "

* para multiplicarlos" ); / para dividirlos (division

break; case "-": Console.WriteLine("El resultado es {0}", 2-3); break; case "*": Console.WriteLine("El resultado es {0}", 2*3); break; case "/": Console.WriteLine("El resultado es {0}", 2/3); break; default: Console.WriteLine("No te entiendo"); break; } } }

El cual solicita al usuario que inserte uno de los smbolos +-*/ , y con un switch compara los resultados para hacer diferentes acciones dependiendo del valor de s, que es la cadena de caracteres que almacena la eleccin del usuario. El resultado debera de ser algo parecido a esto:
Elige hacer algo con los nmeros 2 y 3 + para sumarlos - para restarlos * para multiplicarlos / para dividirlos (division entera) * El resultado es 6

Como habr notado, al final de todo case siempre hay una sentencia break. Esto no es obligatorio, puede haber en su lugar otra sentencia de salto, como un goto, pero siempre

tiene que haber una sentencia de salto, incluso en el default final, a no ser que la sentencia case est vaca. En caso contrario se obtiene un error en tiempo de compilacin. Otros lenguajes, como C/C++ o Java no tienen esta restriccin. La razn de adoptarla en C# es doble: por un lado, elimina muchos errores comunes y en segundo lugar permite al compilador reorganizar las sentencias de los case, y as permitir su optimizacin.

Bucle for
El bucle for de C# es idntico al encontrado en los lenguajes C/C++ y Java. El formato general es
for( inicializacin; condicin; iteracin ) { instrucciones; }

Las sentencias de inicializacin se ejecutan una vez al principio y sirven principalmente para asignar valores a las variables que servirn de contador. Las sentencias de condicin, por su parte, se ejecutan cada vez que el bucle vuelve al principio y sirven para controlar el bucle: ste seguir realizndose siempre y cuando estas condiciones sea true. Las sentencias de iteracin se ejecutan tambin cada vez que se realiza una nuevo ciclo en el bucle, y sirven para cambiar el estado de las variables que gobiernan las sentencias de condicin. Pero todo esto se entiende mejor con un ejemplo
using System; class BucleFor{ public static void Main() { int i; //el contador

for( i = 0; i < 10; i++) { Console.WriteLine( i ); } } }

Este ejemplo imprime por pantalla los 10 primero enteros positivos. Es un caso muy simple del bucle for. Por cierto, el operador ++ lo que hace es que aade una unidad a la variable a la que acompaa, de forma que, por ejemplo, 9++ es 10. De esta forma, la variable i se incrementa a cada vuelta. En el ejemplo anterior, las sentencias de inicializacin y de iteracin eran nicas, pero esto no tiene porqu ser as, de hecho se pueden utilizar varias sentencias separadas por comas. Por ejemplo, se pueden usar dos variables para controlar el bucle
using System; class BucleFor2{ public static void Main() { int i; int j;

for( i=0, j=10; i<j; i++, j--) { Console.WriteLine("( {0} , {1} )", i, j); } } }

Por su parte, la expresin condicionar del bucle for puede ser cualquier expresin que genere un valor booleano. En este caso se ha usado "i>j", pero tambin hubiera sido vlida "i==5", "true" (el bucle se realizar indefinidamente) o "false" (el bucle no se realizar).

Bucle while
El bucle while es un bucle que se realiza hasta que se cumpla determinada condicin. Tiene la forma
while( condicin ) { instrucciones;

Donde la condicintiene que ser un valor booleano. Tiene una estructura muy sencilla, as que vamos a ver directamente un ejemplo.
using System; class BucleWhile{ public static void Main() { int i = 0; while( i<10) { Console.WriteLine( i ); i = i+1; } } }

En el que se realiza lo mismo que en el ejemplo anterior, slo que ahora con un bucle while.

Bucle do-while
Se trata de una ligera variante del bucle anterior, con la diferencia de que ahora primero se ejecutan las instrucciones y luego se evala la condicin, de forma que tiene una estructura:
do{ instrucciones; } while( condicin );

El siguiente ejemplo
class BucleDoWhile{ public static void Main()

{ string s = ""; do { Console.WriteLine( "Introduce si para salir del bucle" ); s = Console.ReadLine(); } while( s != "si" ); } }

muestra un programa que ejecuta un bucle hasta que el usuario introduce "si". Por cierto, != es lo contrario de ==, es decir, != devuelve true cuando los valores comparados son distintos.

Bucle foreach
El bucle foreach se utiliza para hacer iteraciones sobre elementos de una coleccin, como pueden ser los enteros dentro de un arreglo de enteros. La sintaxis sigue la siguiente estructura:
foreach( tipo in coleccion ) { instrucciones; }

Como hemos comentado, el uso ms inmediato es iterar sobre un arreglo de nmeros:


using System; class BucleForeach{ public static void Main() { int[,] arr = {{1,2},{2,3}};

foreach( int elem in arr )

{ Console.WriteLine( elem ); } } }

Este ejemplo slo imprime los valores de una matriz, pero como se puede comprobar mejora mucho la claridad del cdigo comparndolo con una implementacin con bucles for como esta
using System; class BucleForeach{ public static void Main() { int i, j; //seran los indexadores de la

matriz int[,] arr = for(i = 0; i<2; i++ ) {

{{1,2},{2,3}};

for( j = 0; j<2; j++ ) { Console.WriteLine( arr[i,j] ); } } } }

Adems, es posible utilizar el bucle foreach con cualquier tipo que sea una coleccin, no solo con arreglos, como veremos ms adelante.

Cambiando el rumbo
Existen varias formas de cambiar el rumbo de los programas, mediante sentencias de salto incondicional, como goto, return, as como formas de cambiar el rumbo de bucles, como continue o break

Instruccin goto
La instruccin goto sirve para realizar saltos incondicionales a otras partes del programa. Los programadores siempre advierten de los peligros de usar demasiado esta sentencia (es propensa a escribir cdigo ilegible), aunque el contadas ocasiones puede ser de gran utilidad. Como su propio nombre indica, esta sentencia nos lleva a alguna parte del programa, de forma que habr que marcar con una etiqueta la parte del programa a la que deseemos que nos enve. Estas etiquetas se declaran simplemente con el nombre de la etiqueta y dos puntos. Lo vemos en el siguiente ejemplo
using System; class Goto{ public static void Main() { goto dos; uno: Console.WriteLine("Esto no se ejecutar"); dos: Console.WriteLine("Hemos saltado directamente aqu!"); } }

Es un ejemplo muy simple con dos etiquetas: uno y dos. En la ejecucin normal de un programa, primero se ejecutara uno y despus dos. Sin embargo, la instruccin goto hace que saltemos directamente a la instruccin dos. Seguro que se te ocurren multitud de situaciones en las que es til la instruccin goto, as que no insistiremos ms sobre esto.

Sentencia return
Colocar return en alguna parte del programa provoca que el mtodo termine y devuelva el valor especificado. Si estamos en el mtodo Main() , que por ahora es el nico caso que conocemos, return provocar el final del programa. En el ejemplo

using System; class SentenciaReturn{ public static void Main() { double a; principio: Console.WriteLine("Introduce un numero:"); a = Double.Parse( Console.ReadLine() );

if( a > 10 ) { return; } else { goto principio; } } }

utilizamos tambin la instruccin return para implementar un programa en el que se le pide al usuario que introduzca un nmero y solo termina si el nmero es mayor que 10. Este es un mal ejemplo de uso de goto y return, pues se podra haber conseguido lo mismo con un bucle while, pero por ahora sirve. La importancia de la sentencia return se ver con ms claridad cuando veamos mtodos.

La instruccin continue
Es posible realizar la repeticin temprana de un bucle omitiendo el resto del cdigo que contenga el bucle mediante continue. Su comportamiento es muy sencillo:
using System;

class UsoContinue{ public static void Main() { int i; for(i = 0; i<10; i++ ) { continue; Console.WriteLine("Esto nunca se ejecutar!"); } Console.WriteLine("Adios!"); } }

Al compilar el siguiente ejemplo, es posible que el compilador emita una advertencia de que ha detectado cdigo inalcanzable -esto es, que nunca llegar a ejecutarse. Esto no es problema, pues es justamente lo que queremos. Por lo dems, el ejemplo es muy sencillo, dentro del bucle for lo primero que se hace es ejecutar la instruccin continue, de forma que el bucle se repite sin llegar nunca al siguiente Console.WriteLine().

Break para salir de bucles


La instruccin break es el complemento lgico de continue, de forma que si continue repite el bucle, break, lo termina. As, cuando se encuentra una sentencia break dentro de un bucle, ste inmediatamente finaliza y se sigue la ejecucin del programa.
using System; class UsoBreak{ public static void Main() { int i; for( i = 0; i<20; i++) { if( i> 10 )

{ break; } Console.WriteLine( i ); } } }

Este ejemplo muestra el uso de break para imprimir los enteros de 0 a 10. Si no estuviera la sentencia break mostrara los enteros hasta 20, pero al llegar a 11 se ejecuta la instruccin if que desemboca en un break que hace que la ejecucin salga del bucle.

Throw y el manejo de excepciones


La sentencia throw sirve para lanzar excepciones y as modificar el flujo del programa, de modo que pasa a otra instruccin si se captura la excepcin, o se termina el programa si la excepcin no es capturada. Esta sentencia se ver en el captulo sobre manejo de excepciones

Clases en C#
Todo el cdigo y los datos en C# deben ser incluidos en la clase. No puede definir una
variable fuera de una clase y no puede escribir ningn cdigo que no ste en una clase. Las clases pueden tener constructores, que se ejecutan cuando un objeto de la clase es destruido. Las clases admiten herencias simples y todas las clases derivan al final de una clase base llamada objeto. C# admite tcnicas de versiones para ayudar que sus clases evolucionan con el tiempo mientras mantienen la compatibilidad con el cdigo que se use versiones anteriores de sus clases.

Como hemos dicho, C# es un lenguaje orientado objetos. A diferencia de lenguajes como C++ o Python en los que la orientacin a objetos es opcional, en C# es imposible programar sin utilizar esta tcnica. Una prueba de ello es que en C# cualquier mtodo o variable est contenida dentro de un objeto. Por ahora puede asumirse que un objeto y una clase son la misma cosa. Una clase es como una plantilla que describe cmo deben ser las instancias de dicha clase, de forma que cuando creamos una instancia, sta tendr exactamente los mimos mtodos

y variables que los que tiene la clase. Los datos y mtodos contenidos en una clase se llaman miembros de la clase y se accede a ellos siempre mediante el operador "." . En el siguiente ejemplo, se definir una clase, Clase1 y en el mtodo Main se crear una instancia de Clase1 llamada MiClase. Una buena idea es jugar un poco con el cdigo para ver que la instancia de la clase efectivamente tiene los mismos miembros que la clase Clase1 (que sera la plantilla de la que hablbamos antes)
using System; //definimos nuestra clase class Clase1{ public int a = 1;

private double b = 3; public char c = 'a'; } //usamos la clase que hemos creado class UsoClase{ public static void Main() { Clase1 MiClase = new Clase1(); instancia de Clase1 Console.WriteLine( MiClase.c ); //podemos llamar a los tipos que hay dentro de Clase1 } } // asi creamos una

los identificadores public delante de los tipos que hay dentro de Clase1 son necesarios para luego poder ser llamados desde otra clase, como en este caso, que estamos llamando a los miembros de una instancia de Clase1 desde UsoClase. Pero en las clases no solo hay variables, tambin podemos incluir mtodos.
using System; //definimos nuestra clase class Clase1{ public int a = 1;

public double b = 3;

public char c = 'a'; public void Descripcion() { Console.WriteLine("Hola, soy una clase"); } } //usamos la clase que hemos creado class UsoClase{ public static void Main() { Clase1 MiClase = new Clase1(); instancia de Clase1 Console.WriteLine( MiClase.c ); //podemos usar todos los tipos que hay dentro de Clase1 MiClase.Descripcion(); } } // asi creamos una

Podemos hacer ms cosas con las clases, como heredar otras clases o implementar interfaces, pero en este captulo nos centraremos en el uso de mtodos y variables.

Constructores e instancias de una clase


Como hemos visto, las instancias de una clase se crean con la sintaxis
nombreclase objeto = new nombreclase( argumentos );

donde nombreclase es el nombre que le hemos dado a la definicin de la clase, argumentos es una lista de argumentos posiblemente vaca y objeto es el nombre que queremos darle a la instancia de la clase. Una vez creada una clase, sus miembros se inicializan a sus valores predeterminados ( cero para valores numricos, cadena vaca para el tipo string, etc. ). La siguiente clase representa un punto sobre el plano, de forma que tiene dos valores pblicos X e Y, y un mtodo que calcula la distancia al origen del punto (mdulo)

using System; class Punto{ public double X; public double Y; public double Modulo() { double d; d = Math.Sqrt(X*X + Y*Y); //Sqrt = raiz

cuadrada return d; } } class Principal{ public static void Main() { Punto A = new Punto(); A.X = 1; A.Y 1; Console.WriteLine("El {0}", A.Modulo() ); } } modulo del punto (1,1) es: = -

Ahora bien, la forma en la que se crea la instancia, es decir, inicializando los datos a cero (ejercicio: comprobar esto), se puede personalizar, de forma que podemos construir nuestro propio constructor que le diga a la clase los valores por defecto que debe tomar. Esto se realiza simplemente escribiendo dentro de la clase un mtodo que tenga el mismo nombre que la clase y en el que no se especifica el valor devuelto. La clase Par con un constructor sera as:
using System; class public Punto{ double

X; double Y;

public

public Punto() //constructor { X =

1; Y = 1; } public double Modulo() { double d; d = Math.Sqrt(X*X + Y*Y); //Sqrt = raiz cuadrada return d; } }

de forma que ahora al crear una instancia de la clase se crea el punto (1,1) en lugar del (0,0), que era el que se creaba por defecto. De esta forma, al crear la instancia, par ya contendr los valores (1,1). En la prctica se utilizan mucho constructores con parmetros, de forma que al crear la instancia se le asignan valores segn los parmetros. La siguiente implementacin de Par contiene un constructor que acepta un par de valores, que servirn para inicializar los valores A y B
class Punto{ public Punto( double val1, double val2) { X = val1; Y = val2; } ... }

Tambin tenemos la posibilidad de clarar una clase con varios constructores (cada uno con diferenctes parmetros) Lo que har el compilador de C# es buscar el constructor que se adece a los parmetros que le llegan, y ejecutarlo como si fuera un mtodo ms. Dependiendo de la llamada que se haga en el "new", usaremos un constructor u otro.

La palabra reservada this


La palabra reservada this sirve para hacer referencia a miembros de la clase en caso de que se quiera especificar, ya sea por motivos de colisin de nombres o por la claridad del cdigo. Su sitaxis es
this.campo

donde campo es la variable de la clase a la que queremos hacer referencia. En el siguiente ejemplo, declaramos un constructor para la clase Punto, que toma dos argumentos X e Y. Entonces es obligado el uso de this para distinguir entre el X de la clase y el X tomado como parmetro
class Complejo{ double X; double Y; Complejo(double X, double Y) { this.X = X; this.Y = Y; } }

La palabra reservada base


La palabra reservada base sirve para acceder a miembros de la clase heredada de la misma forma que this sirve para acceder a miembros de la propia clase. Su sintaxis es idntica a la de this, esto es:
base.nombre_del_miembro

En el siguiente ejemplo declaramos una clase B que hereda A y que utiliza el mtodo F() de A.

class B : A{ public void H() { base.F(); Console.WriteLine("soy H() de B"); } }

Clases Abstractas
Las clases abstractas son clases que contienen algn mtodo incompleto, esto es, que est definido pero no implementado. Por lo tanto, no se pueden instanciar y su nico propsito es servir de clase base de las que se derivarn otras clases. Las clases que heredan una clase abstracta deben implementar los mtodos incompletos. Las clases abstractas se declaran con la palabra reservada abstract
using System; abstract class A{ public void F(); //metodo no implementado } class B : A{ //error en tiempo de compilacin, B tiene que definir un mtodo F() }

Variables y parmetros
Variables
Las variables representan un espacio donde alojar informacin. Toda variable tiene un tipo que determina qu valor puede ser almacenado en la variabe. Las variables locales son variables que son declaradas dentro de mtodos, propiedades o indexadores. Una variable local queda definida especificando su tipo y una declaracin que especifica el nombre de la variable y un valor inicial opcional, como en:

int a; int b = 1;

pero tambin es posible declarar varias variables locales del mismo tipo de la siguiente forma:
int a, b = 1;

La variable debe tener asignado un valor antes de que pueda ser utilizada. El ejemplo:
class Test { static void Main() { int a; int b = 1; int c = a + b; // error, a no tiene valor asignado } }

da como resultado un error en tiempo de compilacin porque intenta usar la variable antes de que sta haya tomado ningn valor. Un campo es una variable asociada a una clase o estructura. Un campo declarado con el modificador static define una variable esttica, esto es, que no necesita que se haya creado una instancia de la clase en la que est contenida, mientras que un campo declarado sin este modificador define una variable instancia. Un campo esttico est asociado a un tipo, mientras que una variable instancia est asociada con una instancia. El ejemplo
class Empleado { private static string nombre; public int DNI; public decimal Salario; }

muestra la clase Empleado que tiene una variable esttica privada y dos variables instancia pblicas.

Parmetros
La declaracin formal de parmetros tambin define variables. Hay cuatro tipos de parmetros: parmetros por valor, por referencia, parmetros de salida, y arreglos de parmetros. Paso por valor El paso de parmetros por valor es usado por defecto para pasar parmetros a mtodos. Cuando se pasa un parmetro por valor a una funcin realmente se est pasando una copia de dicho parmetro, por lo que las modificaciones que le hagamos al parmetro dentro del mtodo no afectarn al parmetro original. El ejemplo
using System; class Test { static void F(int p) { p++; Console.WriteLine("p = {0}", p); } static void Main() { int a = 1; Console.WriteLine("pre: F(a); Console.WriteLine("post: a = {0}", a); } } a = {0}", a);

muestra un mtodo F que tiene un parmetro por valor llamado p. El ejemplo produce la salida:
pre: p = 2 post: a = 1 a = 1

aunque el valor del parmetro p haya sido modificado dentro del mtodo.

Paso por referencia El paso de parmetros por referencia es la contraposicin lgica al paso por valor. En el paso por referencia no se realiza ninguna copia del objeto, sino que lo que se le pasa a la funcin es una referencia del objeto, de forma que el parmetro pasa directamente a la funcin y cualquier modificacin sobre el parmetro dentro de la funcin afectar al parmetro original
using System;

class Test { static void Swap(ref int a, ref int b) { // intercambia los dos valores int t = a; a = b; b = t; } static void Main() { int x = 1; int y = 2;

Console.WriteLine("pre: Swap(ref x, ref y);

x = {0}, y = {1}", x, y);

Console.WriteLine("post: x = {0}, y = {1}", x, y); } }

muestra un mtodo swap que tiene dos parmetros por referencia. La salida producida es:
pre: x = 1, y = 2

post: x = 2, y = 1

La palabra clave ref debe de ser usada tanto en la declaracin formal de la funcin como en los usos que se hace de sta.

El parmetro de salida es similar al parmetro por referencia, salvo que el valor inicial de dicho argumento carece de importancia. Un argumento de salida se declara con el modificador out. El ejemplo
using System; class Test { static void Divide(int a, int b, out int result, out int remainder) { result = a / b; remainder = a % b; } static void Main() { for (int i = 1; i < 10; i++) for (int j = 1; j < 10; j++) { int ans, r; Divide(i, j, out ans, out r); Console.WriteLine("{0} / {1} = {2}r{3}", i, j, ans, r); } } }

muestra un mtodo Divide que incluye dos parmetros de salida. Uno para el resultado de la divisin y otro para el resto.

Arreglo de parmetros

Para los parmetros descritos anteriormente hay una correspondencia unvoca entre los argumentos que pueden tomar la funcin y los parmetros que los representan. Un arreglo de parmetros permite guardar una relacin de varios a uno: varios argumentos pueden ser representados por un nico arreglo de parmetros. En otras palabras, los arreglos de parmetros permiten listas de argumentos de tamao variable. Un arreglo de parmetros se declara con el modificador params. Slo puede haber un arreglo de parmetros en cada mtodo, y siempre debe ser el ltimo mtodo especificado. El tipo del arreglo de parmetros siempre es un tipo arreglo unidimensional. Al llamar a la funcin se puede pasar un nico argumento de su tipo o bien cualquier nmero de argumentos de tipo del tipo del arreglo. El ejemplo
using System; class Test { static void F(params int[] args) { Console.WriteLine("n de argumentos: {0}", args.Length); for (int i = 0; i < args.Length; i++) Console.WriteLine("args[{0}] = {1}", i, args[i]); } static void Main() { F(); F(1); F(1,2) ; F(1, 2, 3); F(new int[] {1, 2, 3, 4}); } }

muestra un mtodo F que toma un nmero variable de argumentos int, y varias llamadas a este mtodo. La salida es:

n de arguments: 0 n de argumentos:1 args[0] = 1 n de argumentos:2 args[0]=1 args[1]=2 n de argumentos:3 args[0]=1 args[1]=2 args[2]=3 n de argumentos:4 args[0]=1 args[1]=2 args[2]=3 args[3]=4

La mayora de los ejemplos presentes en esta introduccin utilizan el mtodo WriteLine de la clase Console. El comportamiento para las sustituciones, como muestra el ejemplo
int =2; Console.WriteLine("a a,b); = {0}, b = {1}", a = 1, b

se consigue usando un arreglo de parmetros. El mtodo WriteLine proporciona varios mtodos sobrecargados para el caso comn en el que se pasan un pequeo nmeros de argumentos, y un mtodo que usa un arreglo de parmetros.
namespace System { public class Console { public static void WriteLine(string s) {...} public static void WriteLine(string s, object a) {...}

public static void WriteLine(string s, object a, object b) {...} ... public static void WriteLine(string s, params object[] args) {...} } }

Mtodos
Los mtodos, tambin llamados funciones, son trozos de cdigo que reciben unos datos, hacen algo con esos datos, y a veces devuelven algn valor. En C#, todos los mtodos se encuentran contenidas dentro de un objeto. La estructura mnima de un mtodo tiene las siguientes partes: Tipo devuelto Nombre del mtodo Parmetros (puede ser vaco) Cuerpo del mtodo de forma que el siguiente mtodo:
double Divide( double a, double b ) { return a/b; }

devuelve un tipo double, tiene por nombre Divide, los parmetos son dos tipo double, y el cuerpo del mtodo es simplemente "return a/2;". Cuando queramos llamar a un mtodo, debemos simplemente poner el nombre del mtodo y sus argumentos dentro de un parntesis separados por comas. Para llamar al mtodo Dive declarado antes, simplemente debemos escribir
Divide(8, 2);

Segn lo que hemos visto, el ejemplo del mtodo Divide() completo necesita tener una clase donde definirse y un mtodo Main() donde ejecutarse.
using System; class Metodo{ double Divide( double a, double b ) { return a/b; } } class Principal{ public static void Main() { Metodo ); } } Todos los mtodos se encierran existir fuera de una clase. en una clase. Un mtodo no puede m = new Metodo(); 2)

Console.WriteLine(

m.Divide(8,

Tipo devuelto
Un mtodo comienza definiendo el tipo de datos que devolver cuando se le llame. Por ejemplo suponga que quiere escribir un mtodo que suma dos valores enteros y devuelve el resultado. En este caso, escribir el tipo devuelto como int. C # permite escribir un mtodo que no devuelve nada. Por ejemplo, puede escribir un mtodo que simplemente escriba algn texto en la consola, pero que no calcule ningn dato que deba devolver al cdigo que llamo al mtodo. En este caso, se usar la palabra clave void para indicar al compilador de C# que el mtodo no devuelve ningn dato.

Si se quiere devolver un valor de un mtodo se usa la palabra clave return para especificar el valor que debe devolverse. La palabra clave va seguida de una expresin que evala el tipo de valor que debe devolverse. Esta expresin puede ser un valor literal, una variable o una expresin ms compleja. Nombre del mtodo Todos los mtodos deben tener un nombre. Un nombre de mtodo es un identificador y los nombres de mtodos deben seguir las reglas de nomenclatura de cualquier identificador. Recordar que los identificadores deben empezar con una letra mayscula o minscula o con un carcter subrayado. Los caracteres que siguen al primer carcter pueden ser una letra mayscula, un nmero o un subrayado. Lista de parmetros Se puede llamar a mtodos con los parmetros que se usan para pasar los datos al mtodo. Ejemplo, cuando utilizamos un mtodo para sumar dos nmeros enteros, se necesitara enviar al mtodo dos valores de dos nmeros enteros que se va a sumar. La lista de variables recibe el nombre de Lista de Parmetros del mtodo. La lista de parmetros del mtodo aparece entre parntesis y sigue al nombre del mtodo. Cada parmetro de la lista de parmetros es separado por una coma e incluye el tipo del parmetro seguido por su nombre. Se pueden definir mtodos que no reciben ningn parmetro. Tambin se puede colocar la palabra clave void entre los parmetros para especificar que el mtodo no acepta parmetros. Llamar a un mtodo Para llamar a un mtodo, se escribe su nombre en el lugar donde debera ejecutarse el cdigo de este mtodo. Despus del nombre del mtodo se escribe dos parntesis. Como en todas las instrucciones en C# la instruccin de llamada al mtodo debe terminar con punto y coma. Si el mtodo se define con una lista de parmetros, sus valores deben ser especificados en el momento de llamar al mtodo. Debe especificar los parmetros en el mismo orden en que son especificados en la lista de parmetros del mtodo.

Parmetros de entrada
Los parmetros de entrada son parmetros cuyo valor es enviado al mtodo. Los valores de estos parmetros de entrada se enva a la funcin, pero el cuerpo del mtodo no

puede cambiar permanentemente sus valores. En el ejemplo anterior define un mtodo con dos parmetros de entrada Integer1 y Integer2. Los valores

You might also like