English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Types de valeurs et de références C#

Dans C#, les types de données sont classés en fonction de la manière dont ils stockent les valeurs en mémoire. C# inclut les types de données suivants :

  1. Types de valeurs

  2. Types de référence

  3. Types de pointeurs

Types de valeurs

Si le type de données stocke les valeurs de données dans son propre espace mémoire, c'est un type de valeur. Cela signifie que les variables de ces types de données contiennent directement des valeurs.

Tous les types de valeurs dérivent deSystem.ValueTypehérité, tandis queSystem.ValueTypeet puis à partir deSystem.Objecthérité.

Par exemple, la variable entière int i = 100;

Le système stocke100 est stocké dans l'espace mémoire alloué pour la variable i. Le schéma suivant explique comment100 est stocké dans la mémoire de "i" (0x239110Un certain emplacement hypothétique dans ) :

Allocation de mémoire pour les variables de type de valeur

Les types de données suivants sont des types de valeurs :

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • struct

  • uint

  • ulong

  • ushort

Passez des variables de type valeur

  Lorsque vous passez une variable de type valeur d'une méthode à une autre, le système crée une copie distincte de la variable dans l'autre méthode. Si vous changez la valeur dans une méthode, cela n'affectera pas la variable dans l'autre méthode.

static void ChangeValue(int x)
{
    x =  200;
    Console.WriteLine(x);
}
static void Main(string[] args)
{
    int i = 100;
    Console.WriteLine(i);
    
    ChangeValue(i);
    
    Console.WriteLine(i);
}
Sortie :

100
200
100

Dans l'exemple précédent, même après avoir passé la variable i de la méthode Main à la méthode ChangeValue et avoir modifié sa valeur, elle reste inchangée.

Types de référence

Contrairement aux types de valeur, les types de référence ne stockent pas directement leur valeur. Au lieu de cela, ils stockent l'adresse de l'emplacement où est stockée la valeur. En d'autres termes, les types de référence contiennent un pointeur vers un autre emplacement de stockage qui contient des données.

Par exemple, les variables de chaîne suivantes :

string s = "Hello World!!";

La figure suivante montre comment le système alloue de la mémoire pour la variable de chaîne ci-dessus.

Allocation de mémoire pour les variables de type référence

Comme indiqué dans l'image ci-dessus, le système choisit une position aléatoire en mémoire pour la variable s (0x803200). La valeur de la variable s est de 0x600000, c'est l'adresse mémoire de la valeur réelle. Par conséquent, les types de données de type référence stockent l'adresse de l'emplacement où se trouve la valeur réelle, pas la valeur elle-même.

Voici les types de données de type référence :

  • Chaîne

  • Tableau (même si leurs éléments sont de type valeur)

  • Classe

  • Procédure déléguée

Passez des variables de type référence

Lorsque vous passez une variable de type référence d'une méthode à une autre, elle ne crée pas de nouvelle copie; au lieu de cela, elle passe l'adresse de la variable. Par conséquent, si nous changeons la valeur de la variable dans la méthode, cela se reflétera également dans la méthode appelée.

static void ChangeReferenceType(Student std2)
{
    std2.StudentName = "Steve";
}
static void Main(string[] args)
{
    Student std1 = new Student();
    std1.StudentName = "Bill";
    
    ChangeReferenceType(std1);
    Console.WriteLine(std1.StudentName);
}
Sortie :
Steve

Dans l'exemple précédent, nous allons utiliser l'objet Student std1 Passé à la méthode ChangeReferenceType(). Ici, il s'agit en réalité de std1de l'adresse de mémoire. Par conséquent, lorsque la méthode ChangeReferenceType() modifie StudentName, elle modifie en réalité std1de l'objet StudentName, car std1et std2Sont tous pointés vers la même adresse en mémoire.

Valeur null

  La valeur par défaut null des variables de type référence est non initialisée. Null représente le fait de ne pas référencer aucun objet.

Type de référence vide

Les variables de type valeur ne peuvent pas être null car elles stockent des valeurs plutôt que des adresses de mémoire. C#2La version .0 a introduit des types nullable, vous pouvez les utiliser pour allouer null à des variables de type valeur ou déclarer des variables de type valeur sans leur allouer de valeur.