Instrucciones de selección: if, else y switch

Las ifinstrucciones , else y switch seleccionan instrucciones para ejecutarse desde muchas rutas de acceso posibles en función del valor de una expresión. La ifinstrucción selecciona una instrucción que se va a ejecutar en función del valor de una expresión booleana. Una if instrucción se puede combinar con else para elegir dos rutas de acceso distintas en función de la expresión booleana. La switchinstrucción selecciona una lista de instrucciones para ejecutarse en función de una coincidencia de 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:

  • Un patrón relacional (disponible en C# 9.0 y versiones posteriores), para comparar el resultado de una expresión con una constante.
  • Patrón constante: pruebe si un resultado de expresión es igual a una constante.

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 default caso, el control pasa por una switch instrucción .

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 default caso siempre se evalúa en último lugar y solo si no coinciden todos los demás patrones de caso, excepto si goto default se encuentra.

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 switch instrucción , el control no puede pasar de una sección de modificador 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 obtener más información sobre la instrucción de coincidencia switch de patrones, consulte las siguientes notas de propuesta de características:

Vea también