ref (Riferimenti per C#)

Con la parola chiave ref gli argomenti vengono passati per riferimento. Pertanto le modifiche apportate al parametro all'interno del metodo vengono applicate anche a tale variabile quando il controllo viene restituito al metodo chiamante.

Nota

Non confondere il concetto di passaggio per riferimento con il concetto di tipi di riferimento. I due concetti non sono gli stessi. Un parametro di metodo può essere modificato da ref indipendentemente dal fatto che si tratti di un tipo di valore o di un tipo di riferimento. Quando un tipo di valore viene passato per riferimento non viene eseguito il boxing.

Per utilizzare un parametro ref, è necessario che la definizione del metodo e il metodo chiamante utilizzino in modo esplicito la parola chiave ref. Di seguito è riportato un esempio.

    class RefExample
    {
        static void Method(ref int i)
        {
            // Rest the mouse pointer over i to verify that it is an int.
            // The following statement would cause a compiler error if i
            // were boxed as an object.
            i = i + 44;
        }

        static void Main()
        {
            int val = 1;
            Method(ref val);
            Console.WriteLine(val);

            // Output: 45
        }
    }

È necessario che un argomento passato a un parametro ref venga in primo luogo inizializzato. Al contrario, gli argomenti dell'oggetto out non devono essere inizializzati in modo esplicito prima di venire passati. Per ulteriori informazioni, vedere out.

Anche se le parole chiave ref e out provocano un comportamento in fase di esecuzione diverso, non sono considerate parte della firma del metodo in fase di compilazione. Non è pertanto possibile eseguire l'overload dei metodi se l'unica differenza consiste nel fatto che un metodo accetta un argomento ref e l'altro un argomento out. Il codice seguente non viene ad esempio compilato:

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

L'overload può essere tuttavia eseguito se un metodo accetta un argomento ref o out e l'altro non ne utilizza nessuno, come riportato nell'esempio seguente:

    class RefOverloadExample
    {
        public void SampleMethod(int i) { }
        public void SampleMethod(ref int i) { }
    }

Le proprietà non sono variabili, bensì metodi e pertanto non possono essere passate come parametri ref.

Per informazioni su come passare le matrici, vedere Passaggio di matrici mediante ref e out (Guida per programmatori C#).

Esempio

Il passaggio dei tipi di valore per riferimento risulta utile, come illustrato in precedenza in questo argomento, tuttavia l'oggetto ref è utile anche per il passaggio dei tipi di riferimento. In questo modo i metodi chiamati possono modificare l'oggetto cui si fa riferimento, perché il riferimento stesso viene passato per riferimento. Nell'esempio riportato di seguito viene illustrato che, quando un tipo di riferimento viene passato come un parametro ref, l'oggetto stesso può essere modificato. Per ulteriori informazioni, vedere Passaggio di parametri di tipi di riferimento (Guida per programmatori C#).

class RefExample2
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        Console.WriteLine(str);
    }
}
// Output: changed

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Riferimenti

Passaggio di parametri (Guida per programmatori C#)

Parametri di metodo (Riferimenti per C#)

Parole chiave di C#

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#