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#. Si no conoce los patrones, empiece por la introducción a la coincidencia de patrones. Para obtener una sintaxis completa, consulte la referencia de patrón de descarte.
El token de subrayado (_) comunica que no se necesita un valor. Su significado exacto depende de dónde aparezca:
| Context | Significado de _ |
|---|---|
| Una rama de una expresión switch o un patrón anidado | Patrón de descarte que encuentra coincidencia sin capturar el resultado |
Una deconstrucción o un argumento out |
Un descarte que omite un valor generado |
Una asignación como _ = expression |
Asignación de descarte que evalúa la expresión y omite su resultado |
Dos o más parámetros lambda denominados _ |
Descartar parámetros cuyas entradas no se usan |
var _ en un patrón |
Un var patrón con una designación de descarte |
Estos formularios comparten la ortografía y la intención, pero no son intercambiables.
Coincidencia de patrones con switch
En el siguiente ejemplo, statusCode es un int. Cada brazo de conmutador genera un string mensaje que el programa escribe en la consola. El _ final maneja todos los códigos de estado distintos de 200 y 404:
static void ShowStatus()
{
int statusCode = 503;
string message = statusCode switch
{
200 => "Ready",
404 => "Not found",
_ => "Another status"
};
Console.WriteLine(message);
}
Un patrón de descarte se aplica a una expresión de entrada. C# evalúa la expresión y _ coincide con el valor evaluado sin capturarlo. Elija _ como el último brazo de la expresión switch cuando todos los valores que no se hayan contemplado antes deban usar la misma alternativa predeterminada. Póngalo por último porque coincide con todo, incluido null.
El formulario var _ es un patrón var con una designación de descarte. También coincide con todos los valores evaluados, pero no introduce una variable legible. Prefiere el patrón de descarte _ más corto para un switch que lo abarque todo. Para obtener más información sobre var patrones y designaciones, vea Declaración, constante y var patrones.
Declaraciones de deconstrucción
GetForecast devuelve una tupla con cuatro componentes: una string ciudad y tres int valores para la alta temperatura, baja temperatura y probabilidad de lluvia. La declaración de deconstrucción conserva city y high porque el programa los muestra. Usa _ para la baja temperatura y la probabilidad de lluvia porque asignar nombres a esos componentes sin usar implicaría que el código los necesita:
static void ShowForecast()
{
var (city, high, _, _) = GetForecast();
Console.WriteLine($"{city}: high {high}°C");
static (string City, int High, int Low, int RainChance) GetForecast() =>
("Portland", 18, 9, 40);
}
La misma sintaxis de descarte funciona cuando el método de Deconstruct un objeto genera varios valores. Para esas formas, véase Desestructuración de tuplas y otros tipos.
Llamadas a métodos con parámetros out
Supongamos que un campo de entrada acepta texto solo cuando representa un número entero. El método TryParse(String, Int32) devuelve un objeto bool que indica si el análisis se completó correctamente. También produce lo analizado int mediante su parámetro out. El código siguiente solo necesita el resultado booleano para aceptar o rechazar la entrada:
static void CheckInput()
{
string text = "42";
if (IsWholeNumber(text))
{
Console.WriteLine($"Accepted: {text}");
}
else
{
Console.WriteLine("Enter a whole number.");
}
static bool IsWholeNumber(string text) => int.TryParse(text, out _);
}
Úselo out _ cuando solo sea importante el éxito de la operación. El descarte deja claro que el número analizado no es necesario. Si el código posterior necesita el número, asigne un nombre al out argumento, como out int number, y conserve ese valor en su lugar.
Una asignación de descarte, _ = expression, evalúa una expresión e ignora intencionadamente su resultado. A veces resulta útil cuando la expresión no es, de otro modo, una sentencia válida.
Importante
No use _ = Task.Run(...) ni _ = SomeAsyncMethod() para descartar una tarea en el código de la aplicación. Espera a que la tarea finalice para que su finalización y sus excepciones permanezcan en el flujo de llamada. Una asignación de descarte no hace que una tarea sea segura, no observa su excepción ni crea una operación fire-and-forget compatible.
Marcar parámetros lambda sin usar
Un EventHandler recibe un object? remitente y un EventArgs valor. El controlador siguiente no necesita ningún parámetro; solo escribe "Timer tick" en la consola. La nomenclatura de ambos parámetros _ hace que su estado no se use sea visible sin inventar nombres que el cuerpo nunca usa:
static void ShowLambdaDiscards()
{
EventHandler handler = (_, _) => Console.WriteLine("Timer tick");
handler(null, EventArgs.Empty);
}
Elija descartar parámetros cuando una firma de delegado requiera entradas que el cuerpo lambda no use. Si una expresión lambda tiene solo un parámetro denominado _, _ sigue siendo un nombre de parámetro normal para la compatibilidad con versiones anteriores.
Evitar _ como identificador
_ puede ser un identificador normal en contextos en los que C# no reconoce un descarte. Una variable de ámbito denominada _ puede recibir una asignación similar a una asignación de descarte. En un contexto de patrón, una constante o tipo accesible denominado _ también puede cambiar cómo _ se interpreta. Evite declarar sus propias variables, constantes o tipos denominados _; use _ para comunicar la intención de descarte.