Nota
L'accés a aquesta pàgina requereix autorització. Podeu provar d'iniciar la sessió o de canviar els directoris.
L'accés a aquesta pàgina requereix autorització. Podeu provar de canviar els directoris.
Tip
Este artículo forma parte de la sección Aspectos básicos de los desarrolladores que ya conocen al menos un lenguaje de programación y están aprendiendo C#. Comience con la descripción general de la coincidencia de patrones si no está familiarizado con los patrones. Para obtener reglas de lenguaje completas, consulte patrones relacionales y patrones lógicos en la referencia del lenguaje.
Los patrones relacionales y lógicos describen intervalos, alternativas y exclusiones. El método siguiente los combina para clasificar una temperatura:
static string ClassifyTemperature(int temperature) =>
temperature switch
{
< 0 => "Below freezing",
>= 18 and <= 24 => "Comfortable",
(>= 0 and < 10) or > 30 => "Far outside the comfortable range",
_ => "Cool or warm"
};
La expresión temperature es la entrada del patrón. C# lo evalúa una vez y cada brazo switch prueba el valor resultante. Los brazos muestran estas pruebas:
-
< 0comprueba un límite. -
>= 18 and <= 24prueba un intervalo. -
(>= 0 and < 10) or > 30prueba dos intervalos alternativos.
En este artículo se muestran los patrones y las condiciones imperativas para que pueda aprender cada formulario y comparar cómo expresan las mismas decisiones. Una sola condición puede tener un aspecto similar en cualquiera de los dos formularios. Los patrones pueden facilitar la lectura de una serie de ramas relacionadas manteniendo las opciones junto a sus resultados. Elija el formulario que facilita la comprensión del código.
Comparación de valores con patrones relacionales
Un patrón relacional compara su entrada de patrón con una constante en tiempo de compilación mediante <, >, <=o >=. Una constante en tiempo de compilación es un valor que el compilador puede evaluar al compilar el programa. Los literales numéricos y de caracteres, y const las variables de tipos numéricos o de caracteres compatibles, son ejemplos representativos. Las variables, propiedades, llamadas a métodos y static readonly campos normales no son constantes en tiempo de compilación. En el ejemplo inicial, tanto >= 18 como <= 24 prueban el mismo valor de temperature evaluado.
El mismo símbolo relacional puede aparecer en una expresión normal o en un patrón. El siguiente ejemplo usa ambas formas con una temperatura:
static void ShowExpressionAndPattern(int temperature, int threshold)
{
bool belowThreshold = temperature < threshold;
bool belowFreezing = temperature is < 0;
string description = temperature switch
{
< 0 => "Freezing",
0 => "Freezing point",
> 0 => "Above freezing"
};
Console.WriteLine(
$"Below threshold: {belowThreshold}; " +
$"below freezing: {belowFreezing}; {description}");
}
temperature < threshold es una expresión relacional. Evalúa ambos operandos y genera un bool. Cualquiera de los operandos puede ser una expresión noconstante.
En temperature is < 0, temperature es la expresión de entrada del patrón. C# lo evalúa y el patrón < 0 relacional prueba el valor resultante. En el brazo switch < 0 => "Freezing", la expresión anterior a switch proporciona la entrada, por lo que el patrón solo contiene < 0.
La expresión puede compararse temperature con la variable threshold. Un operando de patrón relacional debe ser una constante en tiempo de compilación, por lo que debe usar la expresión relacional cuando el valor de comparación sea una variable. Cuando el valor de comparación es constante, cualquiera de los formularios puede funcionar.
Cuando el operando derecho es constante, elija principalmente por legibilidad. Una expresión relacional suele ajustarse a una comparación directa. Un patrón relacional se compone con otros patrones y se ajusta naturalmente cuando varios intervalos se asignan para cambiar los resultados.
Combinación de condiciones con patrones lógicos
Los patrones lógicos combinan o niegan patrones con los operadores de patrones and, or y not:
- Un
andpatrón coincide cuando ambos patrones anidados coinciden. - Un patrón
orcoincide cuando coincide cualquiera de los patrones anidados. - Un patrón
nottiene éxito cuando su patrón anidado falla.
En el ejemplo de apertura se usa and para describir un intervalo y or para describir alternativas. Un not patrón puede excluir un valor, como en status is not Status.Complete. Los métodos siguientes muestran ambos formularios para que pueda aprender su sintaxis y comparar cómo expresan la misma prueba:
static bool IsWeekendPattern(DayOfWeek day) =>
day is DayOfWeek.Saturday or DayOfWeek.Sunday;
static bool IsWeekendImperative(DayOfWeek day) =>
day == DayOfWeek.Saturday || day == DayOfWeek.Sunday;
El formulario de patrón usa dos patrones constantes unidos por or. El formulario imperativo usa dos expresiones de igualdad unidas por el operador ||condicional-OR . Ambos formularios son concisos y claros para esta única condición. Elija el formulario que mejor se adapte al código circundante. Los patrones a menudo aclaran varias opciones relacionadas en un switch, como en el ejemplo inicial.
Los operadores de patrón forman patrones en lugar de expresiones booleanas: and corresponde a la combinación de patrones, or a alternativas de patrón y not a negación de patrones. Las expresiones booleanas usan &&, ||y !. Elija or cuándo varias alternativas de patrón tienen el mismo resultado. Elija not cuando sea más claro expresar el patrón excluido que enumerar todos los valores aceptados.
Patrones de grupo con paréntesis
Un patrón con paréntesis utiliza paréntesis para indicar o modificar cómo se agrupan los patrones anidados. El enlace determina qué operandos de patrón agrupa un operador, similar a la agrupación implícita cuando no escribe paréntesis. C# especifica el siguiente orden de enlace:
notandor
La prueba siguiente acepta las prioridades 1 a 3 o la prioridad especial 9:
static bool IsAcceptedPriority(int priority) =>
priority is (>= 1 and <= 3) or 9;
El compilador agrupa and antes de or. Los paréntesis hacen que la agrupación prevista sea explícita y las dos alternativas sean fáciles de ver: el intervalo comprendido entre 1 y 3 o 9. Para mejorar la legibilidad, use paréntesis cada vez que un patrón combina and y or, o cuando not se aplica a un patrón compuesto. Los paréntesis también pueden cambiar la agrupación predeterminada, como en not (>= 1 and <= 3).
El orden de comprobación en tiempo de ejecución de los patrones anidados no está especificado y los operadores de patrón siguen reglas de coincidencia de patrones en lugar de reglas booleanas de cortocircuito. Escriba patrones anidados para que su resultado sea independiente del orden de comprobación.
Uso de una when protección para una condición independiente
Los patrones lógicos funcionan mejor cuando los patrones anidados describen el propio valor de entrada. Una when guarda es una condición booleana adicional aplicada a una case etiqueta o a una rama de un switch. Use una protección cuando la decisión también dependa de la información independiente de la entrada del patrón.
La advertencia siguiente depende de la temperatura y de un valor independiente isOutdoors :
static string GetHeatWarning(int temperature, bool isOutdoors) =>
temperature switch
{
> 35 when isOutdoors => "High heat outdoors",
> 35 => "High heat",
_ => "No heat warning"
};
El patrón > 35 relacional describe la temperature entrada. La guarda when isOutdoors comprueba un valor distinto. Una protección también es preferible cuando la condición necesita una llamada al método o una expresión booleana que la sintaxis de patrón no expresa claramente.
Use patrones relacionales y lógicos cuando hagan que las formas o valores permitidos de la entrada sean más fáciles de ver, especialmente en varios brazos de conmutador. Use una expresión booleana normal cuando indique una condición directa más simplemente. Use una when protección cuando una opción de conmutador dependa de un valor independiente o de una condición que se exprese mejor como una expresión booleana.