Parameters modifiers (modificatori generci di parametri) in, out, ref in [C#]

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

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *