1. Valori di default per i parametri
Immagina una caffetteria: se non dici se vuoi lo zucchero nel caffè, il barista di default ne mette un cucchiaino. Ma a volte magari ne vuoi... due! O addirittura niente zucchero (che coraggio!). Stessa cosa con i metodi: a volte è comodo che certi parametri abbiano valori standard se non li specifichi.
E gli argomenti nominati? Sono come dire nell’ordine: “Il latte lo voglio di soia, non normale”, a prescindere dall’ordine in cui di solito si mettono gli ingredienti.
In C# entrambi questi meccanismi rendono il tuo codice più pulito, comodo e ti salvano dagli errori. Li trovi spesso nei progetti veri: dalle librerie .NET ai framework famosi — per questo ai recruiter piace vedere che li usi senza paura.
Sintassi
Il valore di default per un parametro si mette direttamente nella dichiarazione del metodo usando il simbolo =. Se quando chiami il metodo non passi quel parametro, viene usato il valore di default che hai scritto.
void PrintStudent(string name, int age = 18)
{
Console.WriteLine($"Studente: {name}, età: {age}");
}
Come funziona?
- Se chiami PrintStudent("Alisa"); — verrà stampato: Studente: Alisa, età: 18.
- Se chiami PrintStudent("Sasha", 22); — verrà stampato: Studente: Sasha, età: 22.
Funziona per tutti i tipi?
Puoi mettere un valore di default per qualsiasi tipo di parametro, ma ci sono delle particolarità:
- Per i tipi reference (string, classi ecc.): puoi mettere di default null o un valore letterale.
- Per i tipi value (int, double, bool ecc.): metti un valore letterale del tipo giusto.
- Per gli enum (enum), struct: puoi usare anche qui valori di default.
void AddStudent(string name, int course = 1, double averageScore = 5.0, string comment = null)
{
Console.WriteLine($"Aggiunto studente: {name}, corso: {course}, media: {averageScore}, commento: {comment}");
}
Chiamate:
- AddStudent("Ivan");
- AddStudent("Maria", 2);
- AddStudent("Fëdor", 2, 4.7, "Con lode");
Ordine dei parametri con valori
Tutti i parametri opzionali (quelli con valore di default) devono stare a destra (dopo tutti quelli obbligatori). Se provi a mettere un parametro con valore di default prima di uno obbligatorio, il compilatore ti sbatte la porta in faccia.
// Errore!
void Test(int a = 1, int b)
{
// ...
}
Perché così? Perché altrimenti il compilatore non saprebbe a quale parametro assegnare ogni argomento quando chiami il metodo.
2. Argomenti nominati
Di default, quando chiami un metodo e passi gli argomenti, il loro ordine deve essere esattamente quello dei parametri nella definizione del metodo. Ma a volte la lista è lunga, alcuni parametri hanno valori di default, e sbagliare è facile.
Gli argomenti nominati ti permettono di specificare chiaramente a quale parametro stai passando quale argomento, in qualsiasi ordine.
AddStudent(name: "Elizaveta", averageScore: 4.2, comment: "Miglior studente del semestre");
- Qui non specifichiamo il corso (course), quindi sarà 1 (default).
- Non serve ricordare in che posizione era il parametro comment — basta scrivere il suo nome.
Puoi anche invertire i parametri:
AddStudent(averageScore: 3.7, name: "Georgij");
È super comodo, e il codice diventa molto più leggibile!
Uso con argomenti posizionali
Puoi mischiare argomenti nominati e posizionali (senza nome), ma tutti quelli posizionali devono venire prima di quelli nominati.
// Ok
AddStudent("Sergej", averageScore: 4.9);
// Errore
AddStudent(course: 2, "Filipp");
Dopo il primo parametro nominato, tutto il resto deve essere solo nominato. Il compilatore è molto severo su quest’ordine, così ti protegge dalle sorprese.
Comodità nei metodi con tanti parametri
È una tecnica usatissima quando hai metodi con un sacco di opzioni extra. Per esempio, se stessi scrivendo una funzione per aggiungere un utente a un database cloud:
void RegisterUser(
string username,
string password,
string email = null,
bool admin = false,
bool sendWelcomeEmail = true,
string language = "ru"
)
Una chiamata senza argomenti nominati sarebbe un incubo:
RegisterUser("cat", "qwerty", null, false, true, "ru");
Con gli argomenti nominati è tutto chiaro e sicuro:
RegisterUser("cat", "qwerty", admin: true, sendWelcomeEmail: false, language: "en");
Consiglio: usa gli argomenti nominati così il codice si capisce anche senza documentazione!
3. Particolarità e errori comuni
Quando inizi a usare valori di default e argomenti nominati, puoi sbagliare in diversi punti.
- Ordine dei parametri. Metti sempre i parametri con valori di default dopo quelli obbligatori. Se li inverti, il compilatore ti dà errore.
- Cambio del valore di default in una libreria. Se cambi il valore di default in una libreria, i vecchi client non useranno automaticamente quello nuovo. Il valore di default viene compilato nel codice chiamante. Quindi pensaci bene prima di cambiare i default nelle librerie pubbliche.
- Mischiare argomenti posizionali e nominati. Se li mischi, ma dopo un nominato provi a mettere di nuovo un posizionale — non funziona. Tipo: Func(a: 1, 2) — dà errore.
- Errore di battitura nel nome del parametro. Il compilatore qui è severissimo: se sbagli una lettera (tipo scrivi naem: "Misha"), ti becchi un errore tipo: "Non esiste questo parametro, ma che stai facendo?!".
GO TO FULL VERSION