English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 :
Types de valeurs
Types de référence
Types de pointeurs
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 ) :
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
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); }
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.
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.
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
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); }
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.
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.
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.