Introduzione
C# è un linguaggio di programmazione tipizzato, il che significa che dobbiamo sempre dichiarare il tipo dei parametri quando specificato, ma possiamo andare oltre e specificare dei modifiers (modificatori) per ciascun parametro.
Questi modificatori permettono di decidere cosa si può e non si può ( e cosa si deve) fare con i parametri.
In C# ci sono tre modificatori di parametri in, out , ref.
Attenzione a non confondere questi modificatori generici con altri tipi di modificatori detti modificatori di accesso che servono per definire la visibilità di una proprietà o di un metodo di classe (public, private, protected ecc.)
IN
Il modificatore generico in in C# viene utilizzata per specificare che un parametro del metodo viene passato per riferimento, ma il metodo chiamato non può modificare l’argomento.
E’ utile per i parametri che non vengono modificati dal metodo chiamato, ma devono essere passati per riferimento affinché il metodo chiamante possa accedere ai risultati.
// Utilizzo corretto string SetFullName(in string firstName, in string lastName) => $"{firstName} {lastName}"; // Utilizzo Errato string UpdateName(in string firstName, in string lastName) { firstName = "first name"; // -> ERROR: Non si può assegnare la stringa "first name" alla variabile firstname perchè readonly return $"{firstName} {lastName}"; }
REF e OUT
Il modificatore generico out e il modificatore generico ref funzionano grossomodo nella stessa maniera .
Consentono di passare parametri utilizzando i riferimenti e di modificare anche i valori di tali parametri.
out è identica alla parola chiave ref, con l’eccezione che ref necessita che la variabile venga inizializzata prima di essere passata. Quando si lavora con la parola chiave out in C#, sia la firma del metodo che il metodo chiamante devono specificare in modo esplicito la parola chiave out.
Di seguito un esempio dell’utilizzo di out.
int number; OutDemo(out number); Console.WriteLine(number); //Il valore ora è 100 void OutDemo(out int number) { number = 100; }
e un esempio con l’utilizzo di ref.
// Dichierazione ed inizializzazione dei parametri string userFirstName = ""; string userLastName = ""; // chiamata della funzione con il modificatore ref UpdateName(ref userFirstName, ref userLastName); // Dichiarazione del motodo con ref void UpdateName(ref string firstName, ref string lastName) { firstName = "first name"; lastName = "last name"; }
Limitazioni di in, out, and ref
Non è possibile utilizzare le parole chiave in, out e ref nei metodi asincroni o nei metodi iteratori, come quelli che utilizzano un’istruzione yield return o yield break inoltre non è possibile utilizzare la parola chiave in nel primo parametro di un metodo di estensione a meno che il parametro non sia una struttura.
È opportuno notare che le parole chiave in, ref e out non fanno parte della firma del metodo quando ci sono degli overloads.
Pertanto, non è possibile eseguire l’overload di metodi che differiscono nella firma solo rispetto a queste parole chiave.
In altre parole, se hai due metodi con lo stesso nome, ma uno di essi accetta un numero intero come parametro in e l’altro accetta un numero intero come parametro out, il tuo codice non verrà compilato affatto.
Riferimenti Utili
- C# 12 & .NET 8, Guida completa per sviluppatori e principianti: Programmazione ad oggetti, machine learning, creazione di siti e applicazioni, con oltre 200 esercizi risolti
- C#: Algoritmi e Programmi
- Esplorando ChatGPT: Un’introduzione alla conversazione con l’intelligenza artificiale
Sono laureato in Ingegneria Informatica presso l’Univertità degli Studi di Lecce (2008).
Attualmente mi occupo di Sviluppo C#.Net / Mono in ambiente Linux
Sviluppo da anni applicativi ANSI C per terminali POS basati su processori ARM Risc 32Bit con 2-4 MB di Ram.