Partager via


ref (référence C#)

Le mot clé d' ref entraîne un argument d'être passé par référence, pas par valeur.L'effet de passer par référence est que tout changement au paramètre de la méthode est répercutée dans la variable sous-jacente d'argument de la méthode d'appel.La valeur d'un paramètre de référence est toujours identique à la valeur de la variable sous-jacente d'argument.

[!REMARQUE]

Ne confondez pas le concept du passage par référence avec le concept de types référence.Les deux concepts ne sont pas identiques.Un paramètre de méthode peut être modifié par ref, même s'il s'agit d'un type de valeur ou d'un type de référence.Par conséquent, il n'y a aucun boxing d'un type valeur lorsqu'il est passé par référence.

Pour utiliser un paramètre d' ref , la définition de méthode et la méthode d'appel doivent explicitement utiliser le mot clé d' ref , comme indiqué dans l'exemple suivant.

    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 argument passé à un paramètre d' ref doit être initialisé avant d'être passé.Cela diffère des paramètres d' out , dont les arguments ne doivent pas être explicitement initialisés avant d'être passés.Pour plus d'informations, consultez out.

Les membres d'une classe ne peuvent avoir des signatures diffèrent uniquement par ref et out.Une erreur de compilateur se produit si la seule différence entre deux membres d'un type est que l'un d'eux possède un paramètre d' ref et l'autre a un paramètre d' out .Le code suivant, par exemple, ne compile pas.

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

Toutefois, la surcharge peut être effectuée lorsqu'une méthode a ref paramètre ou d' out et l'autre a un paramètre de valeur, comme indiqué dans l'exemple suivant.

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

Dans d'autres situations qui nécessitent une correspondance de signature, telle que masquer ou remplacer, ref et out font partie de la signature et ne s'correspondent pas.

Les propriétés ne sont pas des variables.Ce sont des méthodes, et ne peuvent pas être passés aux paramètres d' ref .

Pour plus d'informations sur le passage de tableaux, consultez Passage de tableaux à l'aide de paramètres ref et out (guide de programmation C#).

Vous ne pouvez pas utiliser les mots clés d' ref et d' out pour les types suivants de méthodes :

  • Méthodes Async, que vous définissez à l'aide de le modificateur d' async .

  • Méthodes d'itérateur, qui incluent une instruction de retour yield ou d' yield break .

Exemple

Les exemples précédents montrent ce qui se produit lorsque vous passez des types valeur par référence.Vous pouvez également utiliser le mot clé d' ref pour passer des types référence.Passer un type référence par référence permet à la méthode appelée de modifier l'objet auquel le paramètre de référence fait référence.l'emplacement de stockage de l'objet est passé à la méthode comme valeur du paramètre de référence.Si vous modifiez l'emplacement de stockage du paramètre, vous modifiez l'emplacement de stockage de l'argument sous-jacent.l'exemple suivant passe une instance d'un type référence comme paramètre d' ref .Pour plus d'informations sur la façon de passer des types référence par valeur et par référence, consultez Passage de paramètres de type référence (Guide de programmation 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

Spécification du langage C#

Pour plus d'informations, consultez la Spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi

Référence

Passage de paramètres (Guide de programmation C#)

Paramètres de méthode (référence C#)

Mots clés C#

Concepts

Guide de programmation C#

Autres ressources

Référence C#