Instrucciones de selección if, if-else y switch

Las instrucciones if, if-else y switch seleccionan las instrucciones que se ejecutarán a partir de muchos trazados posibles en función del valor de una expresión. La instrucción if ejecuta una instrucción solo si una expresión booleana proporcionada se evalúa como true. La instrucción if-else permite elegir cuál de las dos rutas de acceso al código se deben seguir en función de una expresión booleana. La instrucción switch selecciona una lista de instrucciones para ejecutarla en función de la coincidencia de un patrón con una expresión.

Instrucción if

Una instrucción if puede tener cualquiera de las dos formas siguientes:

  • Una instrucción if con una parte else selecciona una de las dos instrucciones que se ejecutarán en función del valor de una expresión booleana, como se muestra en el ejemplo siguiente:

    DisplayWeatherReport(15.0);  // Output: Cold.
    DisplayWeatherReport(24.0);  // Output: Perfect!
    
    void DisplayWeatherReport(double tempInCelsius)
    {
        if (tempInCelsius < 20.0)
        {
            Console.WriteLine("Cold.");
        }
        else
        {
            Console.WriteLine("Perfect!");
        }
    }
    
  • Una instrucción if sin una parte else ejecuta el cuerpo solo si una expresión booleana se evalúa como true, como se muestra en el ejemplo siguiente:

    DisplayMeasurement(45);  // Output: The measurement value is 45
    DisplayMeasurement(-3);  // Output: Warning: not acceptable value! The measurement value is -3
    
    void DisplayMeasurement(double value)
    {
        if (value < 0 || value > 100)
        {
            Console.Write("Warning: not acceptable value! ");
        }
    
        Console.WriteLine($"The measurement value is {value}");
    }
    

Puede anidar instrucciones if para comprobar varias condiciones, como se muestra en el ejemplo siguiente:

DisplayCharacter('f');  // Output: A lowercase letter: f
DisplayCharacter('R');  // Output: An uppercase letter: R
DisplayCharacter('8');  // Output: A digit: 8
DisplayCharacter(',');  // Output: Not alphanumeric character: ,

void DisplayCharacter(char ch)
{
    if (char.IsUpper(ch))
    {
        Console.WriteLine($"An uppercase letter: {ch}");
    }
    else if (char.IsLower(ch))
    {
        Console.WriteLine($"A lowercase letter: {ch}");
    }
    else if (char.IsDigit(ch))
    {
        Console.WriteLine($"A digit: {ch}");
    }
    else
    {
        Console.WriteLine($"Not alphanumeric character: {ch}");
    }
}

En un contexto de expresión, puede usar el operador condicional ?: para evaluar una de las dos expresiones en función del valor de una expresión booleana.

Instrucción switch

La instrucción switch selecciona una lista de instrucciones para ejecutarla en función de la coincidencia de un patrón con una expresión de coincidencia, como se muestra en el ejemplo siguiente:

DisplayMeasurement(-4);  // Output: Measured value is -4; too low.
DisplayMeasurement(5);  // Output: Measured value is 5.
DisplayMeasurement(30);  // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN);  // Output: Failed measurement.

void DisplayMeasurement(double measurement)
{
    switch (measurement)
    {
        case < 0.0:
            Console.WriteLine($"Measured value is {measurement}; too low.");
            break;

        case > 15.0:
            Console.WriteLine($"Measured value is {measurement}; too high.");
            break;

        case double.NaN:
            Console.WriteLine("Failed measurement.");
            break;

        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

En el ejemplo anterior, una instrucción switch usa los siguientes patrones:

Importante

Para obtener información sobre los patrones admitidos por la instrucción switch, consulte Patrones.

En el ejemplo anterior también se muestra el caso default. El caso default especifica las instrucciones que se ejecutarán cuando una expresión de coincidencia no coincida con ningún otro patrón de caso. Si una expresión de coincidencia no coincide con ningún patrón de caso y no hay ningún caso default, el control pasa por una instrucciónswitch.

Una instrucción switch ejecuta la lista de instrucciones en la primera sección de switch cuyo patrón de caso coincida con una expresión de coincidencia y cuya restricción de caso, de haberla, se evalúe como true. Una instrucción switch evalúa los patrones de casos en el orden de texto de arriba a abajo. El compilador genera un error cuando una instrucción switch contiene un caso inaccesible. Ese es un caso que ya se controla mediante un caso superior o cuyo patrón es imposible de hacer coincidir.

Nota:

El caso default puede aparecer en cualquier lugar de una instrucción switch. Independientemente de su posición, el caso default solo se evalúa si el resto de patrones de caso no coinciden o la instrucción goto default; se ejecuta en una de las secciones switch.

Puede especificar varios patrones de casos para una sección de una instrucción switch, como se muestra en el ejemplo siguiente:

DisplayMeasurement(-4);  // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50);  // Output: Measured value is 50.
DisplayMeasurement(132);  // Output: Measured value is 132; out of an acceptable range.

void DisplayMeasurement(int measurement)
{
    switch (measurement)
    {
        case < 0:
        case > 100:
            Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
            break;
        
        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

Dentro de una instrucción switch, el control no puede pasar desde una sección switch a la siguiente. Como se muestra en los ejemplos de esta sección, normalmente se usa la instrucción break al final de cada sección switch para pasar el control desde una instrucción switch. También puede usar las instrucciones return y throw para pasar el control desde una instrucción switch. Para imitar el comportamiento de pasaje explícito y pasar el control a otra sección switch, puede usar la instrucción goto.

En el contexto de una expresión, puede usar la expresión switch para evaluar una expresión única a partir de una lista de expresiones candidatas basada en una coincidencia de patrón con una expresión.

Restricciones de mayúsculas y minúsculas

Un patrón de caso puede no ser lo suficientemente expresivo como para especificar la condición para la ejecución de la sección switch. En tal caso, puede usar una restricción de caso. Se trata de una condición adicional que debe cumplirse junto con un patrón coincidente. Una restricción de caso debe ser una expresión booleana. Especifique una restricción de mayúsculas y minúsculas después de la palabra clave when que sigue un patrón, como se muestra en el ejemplo siguiente:

DisplayMeasurements(3, 4);  // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5);  // Output: Both measurements are valid and equal to 5.

void DisplayMeasurements(int a, int b)
{
    switch ((a, b))
    {
        case (> 0, > 0) when a == b:
            Console.WriteLine($"Both measurements are valid and equal to {a}.");
            break;

        case (> 0, > 0):
            Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
            break;

        default:
            Console.WriteLine("One or both measurements are not valid.");
            break;
    }
}

En el ejemplo anterior se usan patrones posicionales con patrones relacionales anidados.

Especificación del lenguaje C#

Para más información, vea las secciones siguientes de la Especificación del lenguaje C#:

Para más información, consulte la sección Patrones y coincidencia de patrones de la especificación del lenguaje C#.

Consulte también