Exercice – Découvrir les types référence
- 8 minutes
Les types référence incluent les tableaux, les classes et les chaînes. Les types référence sont traités différemment des types valeur concernant la façon dont les valeurs sont stockées quand l’application s’exécute.
Dans cet exercice, vous découvrez en quoi les types référence diffèrent des types valeur et comment utiliser l’opérateur new pour associer une variable à une valeur dans la mémoire de l’ordinateur.
Différences entre les types référence et les types valeur
Une variable de type valeur stocke ses valeurs directement dans une zone de stockage appelée pile. La pile correspond à la mémoire allouée au code en cours d’exécution sur le processeur (également appelée frame de pile, ou frame d’activation). Une fois l’exécution du frame de pile terminée, les valeurs sont supprimées de la pile.
Une variable de type référence stocke ses valeurs dans une région de la mémoire distincte appelée tas. Le tas est une zone de la mémoire qui est partagée par de nombreuses applications s’exécutant sur le système d’exploitation en même temps. Le runtime .NET communique avec le système d’exploitation pour déterminer quelles adresses mémoire sont disponibles, puis demande une adresse à laquelle il peut stocker la valeur. Le runtime .NET stocke la valeur, puis retourne l’adresse mémoire à la variable. Quand votre code utilise la variable, le runtime .NET recherche simplement l’adresse stockée dans la variable et extrait la valeur qui y est stockée.
Vous allez maintenant écrire du code qui illustrera ces idées plus clairement.
Définir une variable de type référence
Supprimez ou utilisez l’opérateur de commentaire de ligne
//pour commenter tout le code des exercices précédents.Mettez à jour votre code dans l’Éditeur Visual Studio Code comme suit :
int[] data;Le code précédent définit une variable qui peut contenir un tableau de valeurs de type
int.À ce stade,
dataest simplement une variable qui peut contenir une référence, ou plutôt une adresse mémoire d’une valeur dans le tas. Étant donné qu’elle ne pointe pas vers une adresse mémoire, elle est appelée une référence null.Créer une instance de tableau
intà l’aide du mot clénewMettez à jour votre code dans l’Éditeur Visual Studio Code pour créer et affecter une nouvelle instance du tableau
int, à l’aide du code suivant :int[] data; data = new int[3];Le mot clé
newindique au runtime .NET de créer une instance du tableauint, puis de se coordonner avec le système d’exploitation pour stocker en mémoire le tableau dimensionné pour trois valeurs int. Le runtime .NET obtempère et retourne une adresse mémoire du nouveau tableauint. Enfin, l’adresse mémoire est stockée dans les données de la variable. Les éléments du tableauintprennent la valeur par défaut0, car il s’agit de la valeur par défaut d’unint.Modifier l’exemple de code pour effectuer les deux opérations en une seule ligne de code
Les deux lignes de code indiquées à l’étape précédente peuvent généralement être réduites à une seule ligne de code permettant de déclarer la variable et de créer une nouvelle instance du tableau
int. Remplacez le code de l’étape 3 par le code suivant.int[] data = new int[3];Bien qu’il n’y ait pas de sortie à observer, cet exercice éclaire la façon dont la syntaxe C# est liée aux étapes de l’utilisation des types référence.
Qu’est-ce qui est différent avec le type de données string C# ?
Le type de données string est également un type référence. Vous vous demandez probablement pourquoi un opérateur new n’a pas été utilisé lors de la déclaration d’une chaîne. Il s’agit uniquement d’une commodité offerte par les concepteurs de C#. Comme le type de données string est utilisé si fréquemment, vous pouvez utiliser ce format :
string shortenedString = "Hello World!";
Console.WriteLine(shortenedString);
Mais en coulisses, une nouvelle instance de System.String est créée et initialisée avec la valeur « Hello World ! ».
Préoccupations pratiques relatives à l’utilisation de types valeur et référence
-
Type de valeur (int) : dans cet exemple,
val_Aetval_Bsont des types de valeurs entières.
int val_A = 2;
int val_B = val_A;
val_B = 5;
Console.WriteLine("--Value Types--");
Console.WriteLine($"val_A: {val_A}");
Console.WriteLine($"val_B: {val_B}");
La sortie suivante s’affiche :
--Value Types--
val_A: 2
val_B: 5
À l’exécution de val_B = val_A, la valeur de val_A est copiée et stockée dans val_B. Par conséquent, lors de la modification de val_B, val_A reste inchangé.
-
Type de référence (tableau) : dans cet exemple,
ref_Aetref_Bsont des types de référence de tableau.
int[] ref_A= new int[1];
ref_A[0] = 2;
int[] ref_B = ref_A;
ref_B[0] = 5;
Console.WriteLine("--Reference Types--");
Console.WriteLine($"ref_A[0]: {ref_A[0]}");
Console.WriteLine($"ref_B[0]: {ref_B[0]}");
La sortie suivante s’affiche :
--Reference Types--
ref_A[0]: 5
ref_B[0]: 5
À l’exécution de ref_B = ref_A, ref_B pointe vers le même emplacement de mémoire que ref_A. Par conséquent, lors de la modification de ref_B[0], ref_A[0] change également, car les deux pointent vers le même emplacement de mémoire. Il s’agit d’une différence clé entre les types valeur et les types référence.
Récapitulatif
- Les types valeur peuvent contenir des valeurs plus petites et sont stockés dans la pile. Les types référence peuvent contenir des grandes valeurs et une nouvelle instance d’un type référence se crée à l’aide de l’opérateur
new. Les variables de type référence contiennent une référence (l’adresse mémoire) à la valeur réelle stockée dans le tas. - Les types référence incluent les tableaux, les chaînes et les classes.
Contrôle des connaissances
Commentaires
Cette page a-t-elle été utile ?
No
Vous avez besoin d’aide pour cette rubrique ?
Vous souhaitez essayer d’utiliser Ask Learn pour clarifier ou vous guider dans cette rubrique ?