Condividi tramite


ref (Riferimenti per C#)

La parola chiave ref comporta un argomento a essere passata per riferimento, non per valore.L'effetto di passaggio per riferimento è che qualsiasi modifica al parametro nel metodo viene riportata nella variabile sottostante dell'argomento del metodo.Il valore di un parametro di riferimento è sempre uguale al valore della variabile sottostante dell'argomento.

[!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, sia la definizione del metodo che il metodo chiamante devono utilizzare in modo esplicito la parola chiave ref, come illustrato nell'esempio seguente.

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

Un argomento passato al parametro ref deve essere inizializzato prima che sia trascorso.È diverso dai parametri out, in cui gli argomenti non devono essere esplicitamente inizializzati prima che vengano passati.Per ulteriori informazioni, vedere out.

I membri di una classe non possono avere firme che differiscono solo da ref e da out.Si verifica un errore del compilatore se l'unica differenza tra due membri di un tipo è che una di esse presenta un parametro ref e l'altro con un parametro out.Il codice seguente, ad esempio, non viene 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) { }
}

Tuttavia, l'overload può essere eseguita quando un metodo ha ref o parametro out e l'altro con un parametro, come illustrato nell'esempio seguente.

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

In altre situazioni che richiedono la corrispondenza della firma, come nascondere o eseguire l'override, ref e out fa parte della firma e non corrisponde.

Le proprietà non sono variabili,Sono metodi e non possono essere passati ai parametri ref.

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

Non è possibile utilizzare le parole chiave out e ref per i seguenti tipi di metodi:

  • Metodi di Asincrona, definite utilizzando il modificatore async.

  • Metodi di iteratore, che includono un'istruzione yield break o prestazioni.

Esempio

Gli esempi precedenti dimostrano che si verifica quando si passa i tipi di valore per riferimento.È inoltre possibile utilizzare la parola chiave ref per passare i tipi di riferimento.Passando un tipo riferimento il riferimento a consente al metodo chiamato per modificare l'oggetto a cui il parametro di riferimento si riferisce.Il percorso di archiviazione dell'oggetto passato al metodo come valore del parametro di riferimento.Se si modifica il percorso di archiviazione del parametro, modificare il percorso di archiviazione dell'argomento sottostante.Il seguente esempio viene passata un'istanza di un tipo di riferimento come parametro ref.Per ulteriori informazioni su come passare i tipi di riferimento per valore e per riferimento, vedere Passaggio di parametri di tipi di riferimento (Guida per programmatori C#).

class RefExample2
{
    static void ChangeByReference(ref Product itemRef)
    {
        // The following line changes the address that is stored in  
        // parameter itemRef. Because itemRef is a ref parameter, the
        // address that is stored in variable item in Main also is changed.
        itemRef = new Product("Stapler", 99999);

        // You can change the value of one of the properties of
        // itemRef. The change happens to item in Main as well.
        itemRef.ItemID = 12345;
    }

    static void Main()
    {
        // Declare an instance of Product and display its initial values.
        Product item = new Product("Fasteners", 54321);
        System.Console.WriteLine("Original values in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);

        // Send item to ChangeByReference as a ref argument.
        ChangeByReference(ref item);
        System.Console.WriteLine("Back in Main.  Name: {0}, ID: {1}\n",
            item.ItemName, item.ItemID);
    }
}

class Product
{
    public Product(string name, int newID)
    {
        ItemName = name;
        ItemID = newID;
    }

    public string ItemName { get; set; }
    public int ItemID { get; set; }
}

// Output: 
//Original values in Main.  Name: Fasteners, ID: 54321

//Back in Main.  Name: Stapler, ID: 12345

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#