Condividi tramite


ref (Riferimenti per C#)

Con la parola chiave ref gli argomenti vengono passati per riferimento. L'effetto è che le eventuali 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. Gli argomenti del parametro out, al contrario, non devono essere inizializzati prima di essere passati. Vedere out.

Le parole chiave ref e out vengono gestite in modo differente in fase di esecuzione, ma allo stesso modo in fase di compilazione. Non è pertanto possibile sottoporre a overload due metodi di cui uno accetta un argomento ref e l'altro un argomento out. Questi due metodi, ad esempio, sono identici in termini di compilazione, quindi questo codice non verrà compilato:

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

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

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

Note

Le proprietà non sono variabili e pertanto non possono essere passate come parametri ref.

Per informazioni sul passaggio delle matrici, vedere Passaggio di matrici mediante i parametri ref e out.

Esempio

Il passaggio di tipi di valore per riferimento risulta utile, come illustrato in precedenza, ma 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 RefRefExample
{
    static void Method(ref string s)
    {
        s = "changed";
    }
    static void Main()
    {
        string str = "original";
        Method(ref str);
        // str is now "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.5.1.2 Parametri di riferimento

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#