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

Mise à jour : novembre 2007

Une variable de type valeur contient directement les données, contrairement à une variable de type référence, qui contient une référence aux données. En conséquence, le passage d'une variable de type valeur à une méthode correspond au passage d'une copie de la variable à la méthode. Les modifications du paramètre intervenant au sein de la méthode n'affectent en rien les données originales stockées dans la variable. Si vous voulez que la méthode appelée modifie la valeur du paramètre, vous devez le passer par référence à l'aide du mot clé ref ou out. Par souci de simplicité, les exemples qui suivent utilisent ref.

Exemple

L'exemple suivant illustre le passage de paramètres de type valeur par valeur. La variable n est passée par valeur à la méthode SquareIt. Les modifications intervenant au sein de la méthode n'affectent en rien la valeur d'origine de la variable.

class PassingValByVal
{
    static void SquareIt(int x)
    // The parameter x is passed by value.
    // Changes to x will not affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(n);  // Passing the variable by value.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 5
*/

La variable n, de type valeur, contient des données (la valeur 5). Lorsque la méthode SquareIt est appelée, le contenu de la variable n est copié dans le paramètre x, qui est mis au carré au sein de la méthode. Dans Main, toutefois, la valeur de n est identique avant et après l'appel de la méthode SquareIt. En fait, la modification qui intervient au sein de la méthode affecte uniquement la variable locale x.

Cet exemple est identique au précédent, si ce n'est que le paramètre est passé à l'aide du mot clé ref. La valeur du paramètre est modifiée après l'appel de la méthode.

class PassingValByRef
{
    static void SquareIt(ref int x)
    // The parameter x is passed by reference.
    // Changes to x will affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(ref n);  // Passing the variable by reference.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 25
*/

Dans cet exemple, ce n'est pas la valeur de la variable n qui est passée, mais une référence de n. Le paramètre x n'est pas int ; il s'agit d'une référence à int, dans ce cas, une référence à n. En conséquence, lorsque x est mis au carré au sein de la méthode, ce qui est réellement mis au carré est l'élément auquel x fait référence : n.

La méthode Swap représente un exemple courant de modification des valeurs des paramètres passés. Deux variables, x et y, sont passées et la méthode permute leur contenu. Vous devez passer les paramètres à la méthode Swap par référence. Dans le cas contraire, vous devrez traiter une copie locale des paramètres au sein de la méthode. Exemple mettant en jeu la méthode Swap et des paramètres de référence :

static void SwapByRef(ref int x, ref int y)
{
    int temp = x;
    x = y;
    y = temp;
}

Lorsque vous appelez cette méthode, utilisez le mot clé ref dans l'appel, comme ceci :

static void Main()
{
    int i = 2, j = 3;
    System.Console.WriteLine("i = {0}  j = {1}" , i, j);

    SwapByRef (ref i, ref j);

    System.Console.WriteLine("i = {0}  j = {1}" , i, j);

    // Keep the console window open in debug mode.
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
}
/* Output:
    i = 2  j = 3
    i = 3  j = 2
*/

Voir aussi

Concepts

Guide de programmation C#

Référence

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

Passage de paramètres de type référence (Guide de programmation C#)