Share via


Comment : différencier le passage d'un struct et le passage d'une référence de classe à une méthode (Guide de programmation C#)

l'exemple suivant montre comment passer struct à une méthode diffère de passer une instance de classe à une méthode. Dans l'exemple, les deux arguments (struct et instance de classe) sont passés par valeur, et les deux méthodes modifient la valeur d'un champ de l'argument. Toutefois, les résultats des deux méthodes ne sont pas identiques car ce qui est passé lorsque vous passez un struct diffère de celui qui est passé lorsque vous passez une instance d'une classe.

Étant donné qu'un struct est type valeur, lorsque vous passez une structure par valeur à une méthode, la méthode reçoit et traite une copie de l'argument de structure. La méthode n'a pas accès au structure d'origine dans la méthode d'appel et ne peut donc pas la modifier de quelque manière que ce soit. La méthode peut uniquement modifier la copie.

une instance de classe est type référence, pas un type valeur. Lorsque un type référence est passé par valeur à une méthode, la méthode reçoit une copie de la référence à l'instance de classe. Autrement dit, la méthode reçoit une copie de l'adresse de l'instance, pas une copie de l'instance elle-même. L'instance de la classe dans la méthode d'appel a une adresse, le paramètre dans la méthode appelée une copie de l'adresse, et les deux adresses renvoient au même objet. Étant donné que le paramètre contient une seule copie de l'adresse, la méthode appelée ne peut pas modifier l'adresse de l'instance de la classe dans la méthode. Toutefois, la méthode appelée peut utiliser l'adresse pour accéder aux membres de classe que les deux l'adresse d'origine et la copie est référencé. Si la méthode appelée modifie un membre de classe, l'instance de la classe d'origine dans la méthode d'appel change également.

la sortie de l'exemple suivant illustre la différence. La valeur du champ d' willIChange de l'instance de classe est modifiée par l'appel à la méthode ClassTaker car la méthode utilise l'adresse dans le paramètre pour rechercher le champ spécifié de l'instance de classe. Le champ d' willIChange de la structure dans la méthode d'appel n'est modifié par un appel à la méthode StructTaker parce que la valeur de l'argument est une copie de la structure elle-même, pas une copie de son adresse. StructTaker modifie la copie, et la copie est perdue dès que l'appel à StructTaker est terminé.

Exemple

class TheClass
{
    public string willIChange;
}

struct TheStruct
{
    public string willIChange;
}

class TestClassAndStruct
{
    static void ClassTaker(TheClass c)
    {
        c.willIChange = "Changed";
    }

    static void StructTaker(TheStruct s)
    {
        s.willIChange = "Changed";
    }

    static void Main()
    {
        TheClass testClass = new TheClass();
        TheStruct testStruct = new TheStruct();

        testClass.willIChange = "Not Changed";
        testStruct.willIChange = "Not Changed";

        ClassTaker(testClass);
        StructTaker(testStruct);

        Console.WriteLine("Class field = {0}", testClass.willIChange);
        Console.WriteLine("Struct field = {0}", testStruct.willIChange);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    Class field = Changed
    Struct field = Not Changed
*/

Voir aussi

Référence

Classes (guide de programmation C#)

Structures (Guide de programmation C#)

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

Concepts

Guide de programmation C#