Condividi tramite


ref (Riferimenti per C#)

Aggiornamento: novembre 2007

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. Per utilizzare un parametro ref, è necessario che la definizione del metodo e il metodo chiamante utilizzino in modo esplicito la parola chiave ref. Esempio:

class RefExample
{
    static void Method(ref int i)
    {
        i = 44;
    }
    static void Main()
    {
        int val = 0;
        Method(ref val);
        // val is now 44
    }
}

È 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 essere passati. Per ulteriori informazioni, vedere out.

La parola chiave ref e l'oggetto out vengono gestiti in modo differente in fase di esecuzione, ma allo stesso modo in fase di compilazione. Pertanto, se un metodo accetta un argomento ref e l'altro un argomento out, non è possibile eseguirne l'overload. Questi due metodi, ad esempio, sono identici in termini di compilazione e pertanto questo codice non eseguirà la compilazione:

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 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.

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 le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 5.1.5 Parametri passati per riferimento

  • 10.6.1.2 Parametri di riferimento

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Passaggio di parametri (Guida per programmatori C#)

Parametri di metodo (Riferimenti per C#)

Parole chiave di C#

Altre risorse

Riferimenti per C#