Méthode Main () et autres méthodes (C# et Java)

Mise à jour : novembre 2007

Cette section décrit les méthodes et la manière avec laquelle les paramètres de la méthode sont transférés par référence et par valeur.

Méthode Main ()

Chaque application C# doit contenir une seule méthode Main qui spécifie où doit commencer l'exécution du programme. En C#, Main comporte une majuscule, tandis qu'en Java main est en caractères minuscules.

Main peut uniquement retourner int ou void et possède un argument de tableau de chaînes facultatif pour représenter les paramètres de ligne de commande :

static int Main(string[] args)
{
    //...
    return 0;
}

Le paramètre de tableau de chaînes qui contient tous les arguments de ligne de commande transférés fonctionne comme en Java. Donc, args[0] spécifie le premier paramètre de ligne de commande, args[1] désigne le deuxième paramètre, et ainsi de suite. Contrairement à C++, le tableau args ne contient pas le nom du fichier EXE.

Autres méthodes

Lorsque vous transférez des paramètres à une méthode, ils peuvent l'être par valeur ou par référence. Les paramètres de valeur prennent simplement la valeur de n'importe quelle variable à utiliser dans la méthode. Par conséquent, la valeur de la variable dans le code appelant n'est pas affectée par les actions effectuées sur les paramètres au sein de la méthode.

Toutefois, les paramètres de référence pointent vers une variable déclarée dans le code appelant, et par conséquent, les méthodes modifieront le contenu de cette variable lorsqu'elle sera transférée par référence.

Passage par référence

En Java et C#, les paramètres de méthode qui font référence à un objet sont toujours passés par référence, tandis que les paramètres de types de données primitifs (types valeur en C#) sont passés par valeur.

En C#, pour passer un type valeur par référence, vous devez spécifier le mot clé ref ou out. La différence entre ces deux mots clés est dans l'initialisation de paramètre. Un paramètre ref doit être initialisé avant utilisation, tandis qu'un paramètre out n'est pas obligatoirement initialisé de manière explicite avant d'être passé et toute valeur antérieure est ignorée.

Le mot clé ref

Spécifiez ce mot clé sur un paramètre de type valeur si vous souhaitez que la méthode appelée change définitivement la valeur des variables utilisées comme paramètres. De cette manière, plutôt que de passer la valeur d'une variable utilisée dans l'appel, une référence à la variable elle-même est passée. La méthode fonctionne ensuite sur la référence, de sorte que les modifications apportées au paramètre pendant l'exécution de la méthode soient persistantes pour la variable d'origine utilisée comme paramètre de la méthode.

Le code suivant illustre ceci dans la méthode Add, où le deuxième paramètre int est passé par référence avec le mot clé ref :

class TestRef
{
    private static void Add(int i, ref int result)
    {
        result += i;
        return;
    }

    static void Main()
    {
        int total = 20;
        System.Console.WriteLine("Original value of 'total': {0}", total);

        Add(10, ref total);
        System.Console.WriteLine("Value after calling Add(): {0}", total);
    }
}

La sortie de cet exemple simple montre que les modifications apportées au paramètre de résultat sont répercutées dans la variable, total, utilisée dans l'appel de méthode Add  :

Original value of 'total': 20

Value after calling Add(): 30

La raison en est que le paramètre de résultat fait référence à l'emplacement de mémoire réel occupé par la variable total dans le code appelant. Une propriété de classe n'est pas une variable et ne peut pas être utilisée directement comme paramètre ref.

Le mot clé ref doit précéder le paramètre lorsque la méthode est appelée, ainsi que dans la déclaration de méthode.

Le mot clé out

Le mot clé out a un effet très similaire à celui du mot clé ref, et les changements apportés à un paramètre déclaré à l'aide de out seront visibles à l'extérieur de la méthode. Les deux différences avec ref sont que toute valeur initiale d'un paramètre out est ignorée dans la méthode, et deuxièmement qu'un paramètre out doit être assigné pendant la méthode :

class TestOut
{
    private static void Add(int i, int j, out int result)
    {
        // The following line would cause a compile error:
        // System.Console.WriteLine("Initial value inside method: {0}", result);

        result = i + j;
        return;
    }

    static void Main()
    {
        int total = 20;
        System.Console.WriteLine("Original value of 'total': {0}", total);

        Add(33, 77, out total);
        System.Console.WriteLine("Value after calling Add(): {0}", total);
    }
}

Dans ce cas, le troisième paramètre de la méthode Add est déclaré avec le mot clé out, et les appels à la méthode requièrent également le mot clé out pour ce paramètre. Le résultat sera :

Original value of 'total': 20

Value after calling Add(): 110

Ainsi, pour résumer, utilisez le mot clé ref lorsque vous souhaitez qu'une méthode modifie une variable existante, et utilisez le mot clé out pour retourner une valeur produite à l'intérieur de la méthode. Ceci est généralement utilisé conjointement à la valeur de retour de la méthode lorsque celle-ci produit plusieurs valeurs de résultat pour le code appelant.

Voir aussi

Concepts

Guide de programmation C#

Main() et arguments de ligne de commande (Guide de programmation C#)

Référence

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

Autres ressources

Langage de programmation C# pour les développeurs Java