Instrucciones de control Instrucciones de control de flujo C# ofrece un conjunto de sentencias similar al de C, C++ o Java. A continuación se estudian muy brevemente cada una de ellas. if if se utiliza para dirigir la ejecución del programa hacia dos caminos diferentes, dependiendo del valor de una expresión. Su estructura es la siguiente: if (expresión_booleana) //BloqueDeCodigoUno else //BloqueDeCodigoDos Si expresión_booleana es True entonces se ejecuta BloqueDeCodigoUno y si es False se ejecuta BloqueDeCodigoDos. No es necesario utilizar siempre la parte else y se puede omitir. Es la instrucción de control más utilizada y no se diferencia de la forma en que se utiliza en Java o C o C++. La única diferencia es que en C# sólo se puede evaluar una expresión booleana. En C# la sentencia siguiente no es válida. int unentero=7; if(unentero) //Codigo En C, se admite esta expresión porque lo que se evalúa es si unentero es cero o distinto de cero. Si el bloque a ejecutar consta de una sola instrucción, no es necesario utilizar las llaves, aunque se puede hacer. En general esto sucede con todas las instrucciones de control. Por ejemplo: if (a<=b) Console.WriteLine( a<=b ); //Sin llaves else Console.WriteLine( a>b ); Console.WriteLine( Esto está dentro del bucle else ); 1/8
Puede, por supuesto, utilizarse sentencias if anidadas. switch. La sentencia switch evalúa una expresión y dependiendo de su valor ejecuta un determinado bloque de código. Proporciona una manera sencilla de ejecutar diferentes partes de código en función del valor de una expresión. Su forma general es: switch (opcion) case valor1: sentencia11; sentencia12;... case valor2: sentencia21; sentencia22;... default: sentenciad1; sentenciad2;... switch funciona de la siguiente manera: el valor de la variable o expresión opcion se compara con cada uno de los valores literales de las sentencias case. Si coincide con alguno, se ejecuta su código asociado. Si ningún valor coincide con el valor de opcion, se ejecuta el código asociado a default. Esta instrucción es también muy parecida en Java, C y C++, pero con un par de diferencias significativas: - No puede omitirse el break correspondiente a cada sentencia case. Daría un error de compilación. Para operar como en C o C++ habría que trabajar con la sentencia goto. Se recomienda al lector que no la utilice. Siempre es posible programar las cosas de tal manera que se omita esta sentencia. - En C#, la sentencia switch permite evaluar int, string, char y enum. Esto proporciona una enorme flexibilidad a esta instrucción. Por ejemplo: void EjecutarMetodo(string comando) switch (comando.tolower()) case "run": DoRun(); case "save": DoSave(); case "quit": DoQuit(); 2/8
default: InvalidCommand(comando); while. Esta instrucción repite un bloque de código mientras una determinada expresión_booleana sea True. Si es False se salta a la instrucción inmediatamente posterior al bloque while. Las llaves no son necesarias si el bloque de código es una sola línea. En esta instrucción, puede no ejecutarse nunca el código del bloque porque expresión_booleana se evalúa antes de ejecutar el bloque y si es False se salta a la sentencia inmediatamente posterior al bloque. Su estructura es la siguiente: while (expresión_booleana) //Codigo class InstruccionWhile int n = 1; while (n < 6) Console.WriteLine("El valor actual de n es 0", n); n++; El bloque de código no se ejecuta si la expresión_booleana es False. La salida de este programa es: 1 2 3 4 5 do-while Esta sentencia es muy parecida a while, con la diferencia de que se evalúa la expresión_booleana después de haberse ejecutado el bloque de código asociado. Por lo tanto, el bloque de código se ejecuta siempre al menos una vez. 3/8
do //Codigo while (expresión_booleana) ; public class InstruccionDoWhile public static void Main () int x; int y = 0; do x = y++; Console.WriteLine(x); while(y < 5); for. Es una instrucción enormemente poderosa y versátil. La estructura general es: for ( inicializador opt ; condicion opt ; iterador opt ) //Codigo Si sólo tiene una instrucción, no es necesario utilizar las llaves para el bloque. Tanto inicializador opt, como condicion opt como iterador opt son opcionales. // Bucle for public class ClaseFor for (int i = 1; i <= 5; i++) Console.WriteLine(i); Al igual que las anteriores instrucciones de control, seguramente esta instrucción será suficientemente conocida por el lector y no se van a estudiar todas las particularidades de ella. 4/8
foreach. Esta sentencia es nueva pero extremadamente poderosa, flexible y sencilla de utilizar. Se utiliza para recorrer una estructura de datos como puede ser una lista, un array, etc. La sentencia foreach repite un bloque de sentencias para cada elemento de un array u objeto de tipo Collection. Se debe utilizar siempre para obtener un información, es decir, para leer. No debería ser usada para cambiar contenidos del objeto Collection porque puede tener resultados imprevisibles. Su estructura es: foreach (tipo identificador in expresion) //codigo donde: tipo Es el tipo del identificador. identificador Nombre de un iterador que identifica cada elemento del array u objeto Collection. expresion Objeto Collection o array. //codigo El bloque de código que será ejecutado. El código se ejecuta para cada elemento del array o colección. Después, el control pasa a la siguiente sentencia del bloque de código namespace PruebaNamespace class MiClase int[] miarray = new int[]30,62,44,55,76; int i=0; foreach(int elemento in miarray) Console.WriteLine("el lugar 0 tiene 1", i,elemento) ; i++; 5/8
el lugar 0 tiene 30 el lugar 1 tiene 62 el lugar 2 tiene 44 el lugar 3 tiene 55 el lugar 4 tiene 76 Se puede observar que sólo se han leído los elementos del array. Como antes se ha mencionado, pueden generarse errores en tiempo de ejecución si se modifican los elementos del array en el interior del bloque. Sentencias de salto. Las sentencias de salto son las siguientes: break continue goto return break. Su forma general es la siguiente: break ; Esta sentencia permite terminar una secuencia de sentencias, es decir, salir de un determinado bucle. Se utiliza en las sentencias switch. También se utiliza para salir de un bucle for, o while, etc. En general, esta sentencia provoca la salida inmediata del bucle. El control del programa pasa a la siguiente sentencia después del bucle. Por ejemplo: class UnaClase for (int i = 1; i <= 100; i++) if (i == 5) Console.WriteLine(i); Console.WriteLine( Esta sentencia se ejecuta fuera del bucle ); La salida de este programa es: 1 6/8
2 3 4 Esta sentencia se ejecuta fuera del bucle continue. Su forma general es la siguiente: continue ; Es una sentencia que se utiliza para dejar de procesar el resto del código de un bucle cuando, por ejemplo, se dé una determinada condición, pero sin salir del bucle. class ClaseContinue for (int i = 1; i <= 10; i++) if (i < 9) continue; Console.WriteLine(i); La salida de este programa es: 9 10 goto. La sentencia goto realiza un salto a la sentencia etiquetada con goto etiqueta; goto case expresion_constante ; goto default ; goto bilbao; //varias sentencias bilbao: otras_sentencias En el código anterior, al llegar a la sentencia goto bilbao, se salta hasta la etiqueta bilbao. La etiqueta se ignora, pero se comienza a ejecutar las sentencias posteriores a ella. 7/8
return. Su forma general es la siguiente: return expresion opt ; Se utiliza para volver de manera explícita desde un método. Se puede utilizar en cualquier parte de un método para que la ejecución salte y vuelva al punto en que ha sido llamado el método. Provoca que el método finalice inmediatamente. Habitualmente se utiliza expresion opt para devolver un valor al punto de llamada del método. En C# un método puede devolver un valor u objeto de cualquier tipo. namespace PruebaNamespace class Circunferencia public double radio; public const double PI=3.14; public Circunferencia(double radio) this.radio=radio; public double CalcularArea() return PI*radio*radio; Circunferencia c=new Circunferencia(2.2); double area=c.calculararea(); Console.WriteLine("Para radio 0 el area es 1", c.radio,area); La salida de este programa es: Para radio 2.2 el area es 15.1976 8/8