El software necesita una forma de tomar decisiones a medida que avanza en la ejecución del código. Aquí es donde entra en juego el flujo de control. El flujo de control del programa se nos proporciona mediante el uso de declaraciones de control. Estas son las palabras clave especiales en el lenguaje C # que le permiten al programador configurar cosas como ramificaciones, bucles e incluso saltos completos a nuevos puntos en el programa durante la ejecución. Echemos un vistazo a estas palabras clave y construcciones como if, switch, do while, for, foreach, while, break, return y algunas otras.
La if
declaración de C #
Al utilizar una if
declaración en un programa, un desarrollador puede tomar una decisión en función de una determinada condición. Imagínese llegar a una bifurcación en el camino. ¿Qué camino eliges? En su cabeza, probablemente evaluará algunas condiciones. Si voy a la izquierda, llegaré al destino a tiempo. Si voy a la derecha, el paisaje será mejor. Así que decides ir bien como lo haría cualquier persona racional. La if
declaración en C # nos permite hacer este tipo de cosas en código. La instrucción if selecciona una rama para su ejecución en función del valor de una expresión booleana. Esa es una forma elegante de decir, si algo es cierto, haz esto, de lo contrario haz aquello. Aquí hay un ejemplo en código C #.
| bool condition = true; if (condition) { Console.WriteLine("condition is true."); } else { Console.WriteLine("condition is false."); } |
Aquí hay otro ejemplo de la declaración if que demuestra que a veces no es necesario incluir llaves.
| if (age <= 2) StayHome(); else if (age < 18) GoToSchool(); else { GoToWork(); } |
Podemos ver en el fragmento de arriba que no se usan llaves para rodear la llamada a StayHome (). En la mayoría de los casos, sin embargo, se considera un buen estilo de codificación usar llaves porque hacen que el código sea más fácil de mantener y más legible. Solo puede omitir las llaves cuando solo hay una línea de código para evaluar. Las llaves siempre son necesarias si necesita ejecutar más de una instrucción. Entonces, cuando configure un bloque de código, o varias líneas de código, rodee eso con llaves. Si no lo hace, solo se ejecutará la primera línea después de la instrucción if. Si la primera expresión dentro de una declaración if devuelve falso, digamos que la edad es 17, entonces StayHome () no se llama. El programa saltará a la siguiente instrucción if para evaluarla. Si eso es cierto, vaya a la escuela ().
Anidar declaraciones if
Puede anidar declaraciones if si lo desea. En el código siguiente, el programa solo escribirá que "El artículo está en oferta" si ambas if
condiciones se evalúan como verdaderas. Debe tener cuidado al anidar varias if
declaraciones juntas, ya que el código puede volverse difícil de leer.
| if (currentprice <= 9.99 ) { if (regularprice == 15.99) { Console.WriteLine("The item is on sale."); } } |
Operador ternario de C #
Una declaración de control realmente conveniente que puede usar es el operador ternario, llamado operador condicional en C #. Tiene tres partes.
La primera parte es una expresión que debe devolver verdadero o falso . Si la expresión devuelve verdadero , devolveremos el valor de la parte 2 que está en el lado izquierdo de los dos puntos. De lo contrario, devolveremos el valor de la parte 3 en el lado derecho de los dos puntos. Este operador condicional es ideal para una verificación condicional rápida para asignar uno de dos valores diferentes a una variable. Así es como suele ver que se utiliza. La misma lógica exacta se puede hacer con una instrucción if, pero con un operador ternario hay menos caracteres para escribir. Es mejor usar esto para verificaciones lógicas simples. Si coloca alguna lógica complicada en el ámbito de un operador condicional, las cosas pueden volverse difíciles de leer.
Derivación
Probemos algunas ramificaciones en nuestro proyecto. Lo que queremos hacer es agregar una forma para que la clase StockStatistics determine la valoración general de la cartera de acciones. Así es como lo configuraremos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stocks { public class StockStatistics { public StockStatistics() { HighestStock = 0; LowestStock = float.MaxValue; } public string StockValuation { get { string result; if (AverageStock >= 200) { result = "Very Expensive"; } else if (AverageStock >= 150) { result = "Expensive"; } else if (AverageStock >= 100) { result = "Average"; } else if (AverageStock >= 50) { result = "Good Value"; } else { result = "Very Good Value"; } return result; } } public float AverageStock; public float HighestStock; public float LowestStock; } } |
Lo que estamos haciendo aquí es observar el precio promedio de las acciones en la cartera para tener una idea de si las cosas tienen un buen valor en la actualidad, o tal vez de caras a muy caras. Podemos agregar esto a la salida de nuestro programa modificando un par de cosas en Program.cs. Aquí, queremos agregar esta salida adicional que nos brinda información sobre la Valoración general. Para que eso suceda, también necesitamos agregar un método sobrecargado para CustomWriteLine () que toma dos parámetros de cadena.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stocks { class Program { static void Main(string[] args) { StockPortfolio portfolio = new StockPortfolio(); portfolio.PortfolioNameChanged += OnPortfolioNameChanged; portfolio.Name = "'Warren Buffet Portfolio'"; portfolio.Name = "'Bootleg Capital'"; portfolio.AddStock(55.81f); portfolio.AddStock(74.52f); portfolio.AddStock(152.11f); portfolio.AddStock(199.85f); portfolio.AddStock(225.28f); StockStatistics stats = portfolio.ComputeStatistics(); Console.WriteLine("The Current Name Is: " + portfolio.Name + "n"); CustomWriteLine("The Average Stock Price Is: ", stats.AverageStock); CustomWriteLine("The Highest Stock Price Is: ", stats.HighestStock); CustomWriteLine("The Lowest Stock Price Is: ", stats.LowestStock); CustomWriteLine("Overall Valuation: ", stats.StockValuation); } static void OnPortfolioNameChanged(object sender, PortfolioNameChangedEventArgs args) { Console.WriteLine($"Portfolio name changed from {args.oldName} to {args.newName}! n"); } static void CustomWriteLine(string description, float result) { Console.WriteLine($"{description}: {result:C} n", description, result); } static void CustomWriteLine(string description, string result) { Console.WriteLine($"{description}: {result:C} n", description, result); } } } |
Ahora, cuando ejecutamos el programa, obtenemos esta salida adicional como vemos aquí.
Declaraciones de conmutador de C #
En C # también tenemos una switch
declaración. Puede usarse para ramificar la ejecución de un programa a un conjunto de declaraciones que están dentro de una etiqueta de caso, que se crea con la palabra clave case
. La declaración de interruptor de C # hace esto al hacer coincidir el valor dentro del interruptor con los valores que especifique en la etiqueta de cada caso.
- Restringido a números enteros, caracteres, cadenas y enumeraciones
- Las etiquetas de caso son constantes
- La etiqueta predeterminada es opcional
Con este conocimiento, queremos configurar una función de recomendación para la clase StockStatistic. Usaremos una declaración de cambio para ayudarnos con eso. Lo que hará esta declaración de cambio es mirar la propiedad StockValuation que acabamos de crear. Es un valor de cadena. Para cada caso, miramos el valor de la cadena para ver si coincide y, de ser así, proporcionamos la recomendación asociada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stocks { public class StockStatistics { public StockStatistics() { HighestStock = 0; LowestStock = float.MaxValue; } public string StockValuation { get { string result; if (AverageStock >= 200) { result = "Very Expensive"; } else if (AverageStock >= 150) { result = "Expensive"; } else if (AverageStock >= 100) { result = "Average"; } else if (AverageStock >= 50) { result = "Good Value"; } else { result = "Very Good Value"; } return result; } } public string Recommendation { get { string result; switch (StockValuation) { case "Very Expensive": result = "Take profits."; break; case "Expensive": result = "Sell some, hold some."; break; case "Average": result = "Continue to hold."; break; case "Good Value": result = "Consider buying."; break; default: result = "Buy."; break; } return result; } } public float AverageStock; public float HighestStock; public float LowestStock; } } |
En el archivo Program.cs, necesitaremos agregar la línea de código resaltada aquí para agregar esta salida adicional en el programa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stocks { class Program { static void Main(string[] args) { StockPortfolio portfolio = new StockPortfolio(); portfolio.PortfolioNameChanged += OnPortfolioNameChanged; portfolio.Name = "'Warren Buffet Portfolio'"; portfolio.Name = "'Bootleg Capital'"; portfolio.AddStock(55.81f); portfolio.AddStock(74.52f); portfolio.AddStock(152.11f); portfolio.AddStock(199.85f); portfolio.AddStock(225.28f); StockStatistics stats = portfolio.ComputeStatistics(); Console.WriteLine("The Current Name Is: " + portfolio.Name + "n"); CustomWriteLine("The Average Stock Price Is: ", stats.AverageStock); CustomWriteLine("The Highest Stock Price Is: ", stats.HighestStock); CustomWriteLine("The Lowest Stock Price Is: ", stats.LowestStock); CustomWriteLine("Overall Valuation: ", stats.StockValuation); CustomWriteLine("Current Recommendation: ", stats.Recommendation); } static void OnPortfolioNameChanged(object sender, PortfolioNameChangedEventArgs args) { Console.WriteLine($"Portfolio name changed from {args.oldName} to {args.newName}! n"); } static void CustomWriteLine(string description, float result) { Console.WriteLine($"{description}: {result:C} n", description, result); } static void CustomWriteLine(string description, string result) { Console.WriteLine($"{description}: {result:C} n", description, result); } } } |
Podemos ver el resultado de esta nueva salida aquí.
La instrucción switch no es excelente para evaluar rangos, pero a veces es útil para reemplazar declaraciones if / else / if .
Iterando en C #
La iteración también se conoce como bucle . El bucle es cuando necesita o desea ejecutar un fragmento de código muchas veces. Iterar en C #, se puede utilizar cualquiera de los for
, while
, do while
, o foreach
construcciones.
C # para
| for (int i = 0; i < 10; i++) { Console.WriteLine(i); } |
0
1
2
3
4
5
6
7
8
9
C # mientras
| int n = 0; while (n < 7) { Console.WriteLine(n); n++; } |
0
1
2
3
4
5
6
C # hacer mientras
| int n = 0; do { Console.WriteLine(n); n++; } while (n < 3); |
0
1
2
C # foreach
| var numbers = new List<int> { 0, 5, 10, 15, 20, 25, 30, 35 }; int count = 0; foreach (int element in numbers) { count++; Console.WriteLine($"Element #{count}: {element}"); } Console.WriteLine($"Number of elements: {count}"); |
Elemento # 1: 0
Elemento # 2: 5
Elemento # 3:10
Elemento # 4:15
Elemento # 5:20
Elemento # 6:25
Elemento # 7:30
Elemento # 8:35
Número de elementos: 8
También podemos practicar algunas construcciones iterativas en nuestro programa de ejemplo. Agreguemos una función que enumere todos los precios de las acciones que se han agregado al programa. Primero, en Program.cs agregaremos este código resaltado.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Stocks { class Program { static void Main(string[] args) { StockPortfolio portfolio = new StockPortfolio(); portfolio.PortfolioNameChanged += OnPortfolioNameChanged; portfolio.Name = "'Warren Buffet Portfolio'"; portfolio.Name = "'Bootleg Capital'"; portfolio.AddStock(55.81f); portfolio.AddStock(74.52f); portfolio.AddStock(152.11f); portfolio.AddStock(199.85f); portfolio.AddStock(225.28f); portfolio.ListStocks(Console.Out); StockStatistics stats = portfolio.ComputeStatistics(); Console.WriteLine("The Current Name Is: " + portfolio.Name + "n"); CustomWriteLine("The Average Stock Price Is: ", stats.AverageStock); CustomWriteLine("The Highest Stock Price Is: ", stats.HighestStock); CustomWriteLine("The Lowest Stock Price Is: ", stats.LowestStock); CustomWriteLine("Overall Valuation: ", stats.StockValuation); CustomWriteLine("Current Recommendation: ", stats.Recommendation); } static void OnPortfolioNameChanged(object sender, PortfolioNameChangedEventArgs args) { Console.WriteLine($"Portfolio name changed from {args.oldName} to {args.newName}! n"); } static void CustomWriteLine(string description, float result) { Console.WriteLine($"{description}: {result:C} n", description, result); } static void CustomWriteLine(string description, string result) { Console.WriteLine($"{description}: {result:C} n", description, result); } } } |
Luego, en StockPortolio.cs necesitaremos implementar ese método. Hace uso del tipo TextWriter en .net y recorre la colección de acciones en el programa. A medida que recorra cada uno, lo escribirá en la consola.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | using System; using System.Collections.Generic; using System.IO; namespace Stocks { public class StockPortfolio { public StockPortfolio() { _name = "'Starting Name'"; stocks = new List<float>(); } public StockStatistics ComputeStatistics() { StockStatistics stats = new StockStatistics(); float sum = 0; foreach (float stock in stocks) { stats.HighestStock = Math.Max(stock, stats.HighestStock); stats.LowestStock = Math.Min(stock, stats.LowestStock); sum += stock; } stats.AverageStock = sum / stocks.Count; return stats; } public void ListStocks(TextWriter destination) { Console.WriteLine("The list of stock prices is"); for (int i = 0; i < stocks.Count; i++) { destination.WriteLine(stocks[i]); } Console.WriteLine("n"); } public void AddStock(float stock) { stocks.Add(stock); } public string Name { get { return _name; } set { if (!String.IsNullOrEmpty(value)) { if (_name != value) { PortfolioNameChangedEventArgs args = new PortfolioNameChangedEventArgs(); args.oldName = _name; args.newName = value; PortfolioNameChanged(this, args); } _name = value; } } } public event PortfolioNameChangedDelegate PortfolioNameChanged; private string _name; private List<float> stocks; } } |
¡Y ahora vemos el resultado de nuestra iteración en acción!
Saltando en C #
En C # puede saltar a un punto específico en el programa usando una de las siguientes palabras clave.
Vimos que break
se usa en combinación con la case
etiqueta dentro de una switch
declaración. También puede ser usado dentro de un while
, do while
, for
, o un foreach
bucle para salir y detener el bucle.
C # descanso
Detiene el bucle de cierre más cercano o la instrucción de cambio en la que aparece.
| for (int i = 1; i <= 50; i++) { if (i == 7) { break; } Console.WriteLine(i); } |
1
2
3
4
5
6
C # continuar
Pasa el control a la siguiente iteración del while, do, for o fore cada bucle en el que aparece.
| for (int i = 1; i <= 5; i++) { if (i < 4) { continue; } Console.WriteLine(i); } |
4
5
C # goto
Cambia el control directamente a un punto etiquetado en el programa.
| int[] nums = new int[] { 1, 2, 3, 4, 5 }; foreach (int num in nums) { if (num == 3) { goto target; } Console.WriteLine(num); } target: Console.WriteLine("Stopping at 3!"); |
1
2
¡Parando a las 3!
Retorno de C #
Detiene la ejecución del método donde aparece y devuelve el control al código de llamada. A menudo devuelve un valor, pero no es necesario.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | static int One() { // This method returns an integer. return 100; } static string Two() { // This method returns a string. return "Hi There!"; } static int Three(int num1, int num2) { // This method returns an integer based on an expression. return (num1 * 10) + num2; } static void Four() { // This method uses a return statement with no expression (void). Console.WriteLine("Four executed"); return; } |
Resumen de declaraciones de control de C #
En este tutorial, cubrimos los diversos tipos de declaraciones de control de flujo disponibles para nosotros en el lenguaje de programación C #. Las declaraciones de control se clasifican aproximadamente en aquellas que realizan bifurcaciones, aquellas para bucles y aquellas para saltar. Las declaraciones de bifurcación incluyen if, else if, el operador condicional y la declaración de cambio. Cuando necesitamos iterar sobre cosas, o realizar un bucle, buscamos las declaraciones for, while, do while y foreach. Por último, miramos brevemente las construcciones de salto como romper, continuar, goto y regresar.
0 Comentarios