Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Tip
Questo articolo fa parte della sezione Nozioni fondamentali per gli sviluppatori che già conoscono almeno un linguaggio di programmazione e stanno imparando C#. Se non conosci i pattern, inizia con la panoramica del pattern matching. Per una sintassi completa, vedere il riferimento al modello di eliminazione.
Il token di sottolineatura (_) comunica che un valore non è necessario. Il suo significato esatto dipende dalla posizione in cui appare:
| Context | Significato di _ |
|---|---|
| Un arm di espressione switch o un modello annidato | Modello di eliminazione che corrisponde senza acquisire il risultato |
Una decostruzione o out un argomento |
Un discard che ignora un valore prodotto |
Un'assegnazione come _ = expression |
Assegnazione discard che valuta l'espressione e ne ignora il risultato |
Due o più parametri lambda denominati _ |
Eliminare i parametri i cui input non vengono usati |
var _ in un modello |
Modello var con una designazione di eliminazione |
Questi moduli condividono ortografia e finalità, ma non sono intercambiabili.
Corrispondenza di modelli con switch
Nell'esempio seguente, statusCode è un int. Ogni braccio switch genera un string messaggio, che il programma scrive nella console. L'ultima _ gestisce ogni codice di stato diverso da 200 e 404:
static void ShowStatus()
{
int statusCode = 503;
string message = statusCode switch
{
200 => "Ready",
404 => "Not found",
_ => "Another status"
};
Console.WriteLine(message);
}
Un modello discard viene applicato a un'espressione di input. C# valuta l'espressione e _ corrisponde al valore valutato senza acquisiscerlo. Scegliere _ come ramo finale dell'espressione switch quando ogni valore non gestito in precedenza deve usare la stessa alternativa di riserva. Mettilo per ultimo perché corrisponde a tutto, incluso null.
Il modulo var _ è un var modello con una designazione di annullamento. Corrisponde anche a ogni valore valutato, ma non introduce una variabile leggibile. Preferisce il modello di eliminazione più _ breve per un'opzione catch-all. Per altre informazioni su var modelli e designazioni, vedere Dichiarazione, costante e var modelli.
Dichiarazioni di smontaggio
GetForecast restituisce una tupla con quattro componenti: una string città e tre int valori per la temperatura elevata, la bassa temperatura e la probabilità di pioggia. L'istruzione di decostruzione mantiene city e high perché il programma li visualizza. Usa _ per la bassa temperatura e la probabilità di pioggia perché dare un nome a quei componenti inutilizzati implicherebbe che il codice ne abbia bisogno:
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 stessa sintassi di eliminazione funziona quando il metodo di Deconstruct un oggetto produce diversi valori. Per queste forme, vedere Decostruzione di tuple e altri tipi.
Chiamate ai metodi con out parametri
Si supponga che un campo di input accetti testo solo quando rappresenta un numero intero. Il TryParse(String, Int32) metodo restituisce un oggetto bool che indica se l'analisi è riuscita. Produce anche l'oggetto analizzato int tramite il relativo out parametro. Il codice seguente richiede solo il risultato booleano per accettare o rifiutare l'input:
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 _);
}
Utilizzare out _ quando è importante solo l'esito positivo dell'operazione. Lo scarto indica chiaramente che il numero analizzato non è necessario. Se il codice successivo richiede il numero, assegnare all'argomento out un nome, ad esempio out int numbere mantenere tale valore.
Un'assegnazione discard, _ = expression, valuta un'espressione e ne ignora intenzionalmente il risultato. A volte è utile quando l'espressione non è di per sé un'istruzione valida.
Importante
Non usare _ = Task.Run(...) o _ = SomeAsyncMethod() per ignorare un'attività nel codice dell'applicazione. Attendere l'attività in modo che il completamento e le eccezioni rimangano nel flusso chiamante. Un'assegnazione a discard non rende sicuro un Task, non ne osserva l'eccezione e non crea un'operazione 'fire-and-forget' supportata.
Contrassegnare i parametri lambda inutilizzati
Un EventHandler oggetto riceve un object? mittente e un EventArgs valore. Il gestore seguente non necessita di alcun parametro; scrive "Timer tick" solo nella console. Assegnare a entrambi i parametri il nome _ rende evidente che non vengono utilizzati, senza inventare nomi che il corpo della funzione non usa mai:
static void ShowLambdaDiscards()
{
EventHandler handler = (_, _) => Console.WriteLine("Timer tick");
handler(null, EventArgs.Empty);
}
Scegliere i parametri di eliminazione quando una firma del delegato richiede input che il corpo lambda non usa. Se un'espressione lambda ha un solo parametro denominato _, _ rimane un nome di parametro ordinario per la compatibilità con le versioni precedenti.
Evitare _ come identificatore
_ può essere un normale identificatore nei contesti in cui C# non lo riconosce come elemento discard. Una variabile nell'ambito denominata _ può ricevere un'assegnazione simile a un'assegnazione discard. In un contesto di pattern, una costante o un tipo accessibile denominato _ può anche modificare la modalità _ di interpretazione. Evitare di dichiarare variabili, costanti o tipi personalizzati denominati _. Usare _ per comunicare la finalità di eliminazione.