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 si ha familiarità con la programmazione, iniziare prima con le esercitazioni introduttive . Per la sintassi completa, vedere istruzioni di selezione nel riferimento al linguaggio.
Venire da un'altra lingua? C++, Java e JavaScript condividono tutti il patrimonio di C, quindi if, elsee switch leggono lo stesso in C#. L'unica differenza degna di nota: C# vieta il fall-through tra clausole switch non vuote, e ogni etichetta case può verificare un modello anziché solo una costante. Se provieni da Python, in C# if/else if/else corrisponde a if/elif/else, e l'elemento switch di C# basato su pattern è ciò che più si avvicina all'istruzione match di Python.
Le istruzioni di selezione scelgono il blocco di codice eseguito in base a una condizione. C# fornisce due: if (con un facoltativo else) per la diramazione in un valore booleano e switch per confrontare un valore con diversi casi.
Un'espressione booleana è qualsiasi espressione che restituisce true o false, ad esempio il confronto temperature >= 25.
Diramazione con if e else
Un'istruzione if esegue il proprio blocco solo se la sua espressione booleana è true. Aggiungere un else blocco per fornire il codice eseguito quando la condizione è false:
int temperature = 28;
// An if statement runs its block only when the condition is true.
// The else block runs when the condition is false.
if (temperature >= 25)
{
Console.WriteLine("Warm"); // => Warm
}
else
{
Console.WriteLine("Cool");
}
Il corpo di un oggetto if o else è una singola istruzione, ad esempio un'assegnazione o una chiamata al metodo. Un blocco di istruzioni è esso stesso una singola istruzione che racchiude zero o più istruzioni tra parentesi graffe ({ }).
Molti standard di codifica consigliano di racchiudere i corpi dei rami tra le parentesi graffe, anche per una singola istruzione. Le parentesi graffe esplicitano l'ambito. Impedisce un errore comune: l'aggiunta di una seconda riga in un secondo momento che si prevede di eseguire in modo condizionale, ma che viene eseguita in modo incondizionato. Solo le parentesi graffe decidono quali istruzioni appartengono al ramo. C# non considera gli spazi vuoti come significativi, quindi il rientro da solo non lo fa mai. Le parentesi graffe sono consentite anche attorno a una singola riga: il blocco coincide con l'unica istruzione che il ramo esegue. Indenta il codice per renderlo leggibile, ma affidati alle parentesi graffe per delimitare il blocco.
Testare diverse condizioni con else if
Per scegliere tra più di due percorsi, concatenare le condizioni con else if. C# valuta ogni condizione nell'ordine ed esegue il primo blocco la cui condizione è true, quindi ignora il resto. Un ultimo else gestisce tutti i casi rimanenti:
int score = 82;
// Chain conditions with else if. The first branch whose condition is
// true runs; the compiler skips the rest.
string grade;
if (score >= 90)
{
grade = "A";
}
else if (score >= 80)
{
grade = "B";
}
else if (score >= 70)
{
grade = "C";
}
else
{
grade = "F";
}
Console.WriteLine(grade); // => B
L'ordine è importante in una catena. Poiché la prima condizione corrispondente prevale, inserire prima le condizioni più specifiche. Nell'esempio precedente, testare score >= 80 prima di score >= 70 garantisce che un punteggio di 82 venga associato a "B" anziché a "C".
Trova la corrispondenza di un valore con un'istruzione switch
Quando si confronta un singolo valore con molti casi distinti, un'istruzione switch risulta più chiara di una lunga catena di else if. Come if, l'istruzione switch è un'istruzione di diramazione: sceglie quale codice eseguire. Ogni case etichetta elenca un valore da trovare e ogni case sezione termina con un'istruzione break . Impila le etichette in modo che condividano un corpo e usa la sezione default per i valori che non corrispondono ad alcun caso:
DayOfWeek day = DayOfWeek.Saturday;
// A switch statement compares one value against several case labels.
// Stacked labels share a body. Each section ends with break, and the
// default section runs when no case matches.
switch (day)
{
case DayOfWeek.Saturday:
case DayOfWeek.Sunday:
Console.WriteLine("Weekend"); // => Weekend
break;
default:
Console.WriteLine("Weekday");
break;
}
A differenza di C e Java, C# non consente l'esecuzione di passare da una sezione nonempty case alla successiva. Ogni sezione contenente il codice deve terminare con un'istruzione break (o un'altra istruzione jump, ad esempio return o goto). Questa regola impedisce i bug accidentali di fall-through comuni in tali lingue.
Modelli di test con case e when
Un'etichetta case non è limitata ai valori costanti. Può testare un modello, ovvero una regola che descrive la forma o il valore dei dati. Un modello relazionale, ad < 0 esempio, corrisponde a qualsiasi valore minore di zero. Aggiungere una when clausola per aggiungere una condizione aggiuntiva che deve anche essere true soddisfatta perché il caso corrisponda:
int measurement = 42;
// A case label can test a pattern instead of a constant. A when clause
// adds a condition that must also be true for the case to match.
switch (measurement)
{
case < 0:
Console.WriteLine("Negative");
break;
case 0:
Console.WriteLine("Zero");
break;
case > 0 when measurement % 2 == 0:
Console.WriteLine("Positive and even"); // => Positive and even
break;
default:
Console.WriteLine("Positive and odd");
break;
}
I casi basati su pattern vengono valutati dall'alto verso il basso, quindi i pattern più specifici devono precedere quelli più generali. Per il catalogo completo dei pattern, consulta corrispondenza dei pattern.
Selezionare un valore con un'espressione
Le if istruzioni e switch decidono quale codice viene eseguito. Quando invece è necessario scegliere un valore, usare un'espressione. Un'espressione viene valutata come un valore, quindi è possibile usarla in qualsiasi punto in cui è previsto un valore, ad esempio nella parte destra di un'assegnazione o come argomento di un metodo. C# offre moduli di espressione che selezionano un valore da alternative, ad esempio l'operatore condizionale e l'espressione switch .
Operatore condizionale ?:
L'operatore ?: condizionale sceglie uno dei due valori in base a una condizione booleana.
Per la sintassi, il comportamento a corto circuito e le indicazioni su come sceglierlo invece di if/else, vedere Operatore ?:condizionale .
espressione switch
Un'espressione switch è la controparte in forma di espressione dell'istruzione switch. Anziché eseguire il codice per il caso corrispondente, restituisce un valore. È più conciso che assegnare un valore in ogni ramo di un'istruzione switch e il compilatore avvisa quando i rami non coprono tutti i possibili valori di input. L'espressione switch è un elemento fondamentale del pattern matching. Per informazioni su quando e come utilizzarla, vedi corrispondenza dei criteri e il riferimento per l'espressione switchespressione.