CodeGym /Corsi /C# SELF /Valori di default e argomenti nominati

Valori di default e argomenti nominati

C# SELF
Livello 8 , Lezione 4
Disponibile

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}");
}
Valore di default per il parametro 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}");
}
Più parametri con valori di default diversi

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)
{
    // ...
}
Un parametro con valore di default non può stare prima di uno obbligatorio

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");
Chiamata di metodo con argomenti nominati
  • 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");
L’ordine degli argomenti nominati non conta

È 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, tutti gli altri devono essere nominati

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"
)
Metodo con tanti parametri e valori di default

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?!".
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION