Types > Types valeur

Références

L'actualité

Librairie

L'information

Caractéristiques des types valeur

Une variable d'un type valeur contient une valeur du type. Par exemple, une variable du type int peut contenir la valeur 42. Ce type s'oppose au type référence, qui contient une référence à une instance du type, également appelée objet. Lorsque vous affectez une nouvelle valeur à une variable d'un type valeur, cette valeur est copiée. Si vous affectez une nouvelle valeur à une variable d'un type référence, la référence est copiée, et non l'objet lui-même.

Tous les types valeur sont implicitement dérivés de System.ValueType.

Contrairement aux types référence, vous ne pouvez pas faire dériver un nouveau type d'un type valeur. En revanche, comme les types référence, les structs peuvent implémenter des interfaces.

Les variables de type valeur ne peut pas être null par défaut. Toutefois, les variables des types Nullable correspondants peuvent être null.

Chaque type valeur a un constructeur par défaut implicite qui initialise la valeur par défaut de ce type. Pour plus d'informations sur les valeurs par défaut des types valeur.

bool

Le mot clé bool est un alias de System.Boolean. Il sert à déclarer des variables qui stockent les valeurs booléennes : true et false.

Si vous avez besoin d'une variable booléenne qui peut également avoir la valeur null, utilisez bool?. Pour plus d'informations, voir les types Nullable.



byte

byte désigne un type intégral qui stocke des valeurs comme indiqué dans le tableau suivant.

Type Plage Size Type .NET
byte 0
255
Entier 8 bits signé System.Byte
Littéraux
Vous pouvez déclarer et initialiser une variable byte en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Si le littéral entier est en dehors de la plage autorisée pour le type byte (autrement dit, s'il est inférieur à Byte.MinValue ou supérieur à Byte.MaxValue), une erreur de compilation se produit. Dans l'exemple suivant, les entiers égaux à 201 représentés comme des littéraux décimaux, hexadécimaux et binaires sont implicitement convertis des valeurs int en byte.

Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.


char

Le mot clé char permet de déclarer une instance de la structure System.Char utilisée par le .NET Framework pour représenter un caractère Unicode. La valeur d'un objet Char est une valeur numérique 16 bits (ordinale).

Les caractères Unicode sont utilisés pour représenter la plupart des langues écrites dans le monde.

Type Plage Size Type .NET
char U+0000
U+FFFF
Caractère Unicode 16 bits System.Char
Littéraux
Les constantes de type char peuvent être représentées sous la forme de littéraux de caractères, d'une séquence d'échappement hexadécimale ou d'une représentation Unicode. Vous pouvez également effectuer un cast des codes de caractères de type intégral. Dans l'exemple suivant, quatre variables char sont initialisées avec le même caractère (X) :



Conversions

Vous pouvez convertir implicitement un char en ushort, int, uint, long, ulong, float, double ou decimal. Par contre, vous ne pouvez pas convertir implicitement d'autres types en type char. Le type System.Char fournit plusieurs méthodes statiques à utiliser avec des valeurs char.

decimal

Le mot clé decimal indique un type de données 128 bits. Par rapport à d'autres types à virgule flottante, le type decimal fournit une plus grande précision et une plage de valeurs plus réduite; il est donc particulièrement approprié aux calculs financiers et monétaires. Le tableau suivant indique la plage de valeurs approximative et la précision fournies par le type decimal.

Type Plage Size Type .NET
decimal ±1,0 x 10-28
±7,9228 x 1028
28-29 chiffres significatifs System.Decimal
La valeur par défaut de decimal est 0m.

Littéraux
Si vous souhaitez qu'un littéral numérique réel soit considéré comme une valeur de type decimal, utilisez le suffixe m ou M, comme indiqué ci-après :

Si le suffixe m n'est pas spécifié, le nombre est considéré comme une valeur de type double et génère une erreur du compilateur.

Conversions
Les types intégraux sont convertis implicitement en type decimal et ont pour résultat une valeur de type decimal. Par conséquent, vous pouvez initialiser une variable de type decimal avec un littéral d'entier, sans utiliser de suffixe, par exemple :

Étant donné qu'il n'y a pas de conversion implicite entre les autres types virgule flottante et le type decimal, un cast doit être utilisé pour convertir ces types. Par exemple :


Vous pouvez aussi combiner, au sein d'une même expression, des types decimal et des types numériques intégraux. En revanche, si vous combinez le type decimal avec les autres types virgule flottante sans spécifier de cast, une erreur de compilation se produit.

Mise en forme d'une sortie décimale
Vous pouvez appliquer un format à un résultat à l'aide de la méthode String.Format, ou de la méthode Console.Write, qui appelle String.Format(). Le format monétaire est spécifié à l'aide du format de chaîne monétaire standard "C" ou "c", comme le montre l'exemple ci-dessous.

Exemple
Dans cet exemple, le résultat est mis en forme à l'aide de la chaîne de format monétaire. Notez que la valeur x est arrondie, car le nombre de décimales excède 0,99. La variable y, représentant le nombre maximal exact de chiffres, est affichée dans le format correct.

dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

double

Le mot clé double désigne un type simple qui stocke des valeurs à virgule flottante de 64 bits.
Le tableau suivant montre la précision et la plage approximative pour le type double.

Type Plage Size Type .NET
double ±5,0 x 10-324
±1,7 x 10308
~15-17 chiffres System.Double
Littéraux
Par défaut, un littéral numérique réel sur le côté droit de l'opérateur d'assignation est traité comme double. Toutefois, si vous souhaitez qu'un nombre entier soit traité comme double, utilisez le suffixe d ou D, par exemple :
Conversions
Vous pouvez combiner des types numériques intégraux et des types virgule flottante dans une expression. Dans ce cas, les types intégraux sont convertis en types virgule flottante. L'évaluation de l'expression est exécutée d'après les règles suivantes :

  • Si l'un des types virgule flottante est double, l'expression prend la valeur double, ou bool dans les comparaisons relationnelles et les comparaisons d'égalité.
  • Si l'expression n'a pas de type double, elle prend la valeur float, ou bool dans les comparaisons relationnelles et les comparaisons d'égalité.
Une expression à virgule flottante peut contenir les ensembles de valeurs suivants :

  • Zéro positif et négatif.
  • Infini positif et négatif.
  • Valeur NaN (N'est pas un nombre).
  • L'ensemble fini de valeurs différentes de zéro.
Dans l'exemple suivant, un int, un short, un float et un double sont ajoutés pour donner un résultat double.

dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

enum

Le mot clé enum est utilisé pour déclarer une énumération. Il s'agit d'un type distinct qui se compose d'un ensemble de constantes nommées, appelé liste d'énumérateurs.

Il est généralement préférable de définir une énumération directement dans un espace de noms pour que toutes les classes de l'espace de noms puissent y accéder avec la même facilité. Toutefois, une énumération peut également être imbriquée dans une classe ou un struct.

Par défaut, le premier énumérateur a la valeur 0 et chaque énumérateur successif est augmenté de 1. Par exemple, dans l'énumération suivante, Sat est 0, Sun est 1, Mon est 2, et ainsi de suite.

Le nom d'un énumérateur ne peut pas contenir d'espaces.

L'instruction suivante affecte l'énumérateur Sun à une variable du type int en utilisant un cast pour convertir de enum en int. Exemple
Dans l'exemple suivant, une énumération, Day, est déclarée. Deux énumérateurs sont explicitement convertis en entiers et affectés à des variables entières.

float

Le mot clé float désigne un type simple qui stocke des valeurs à virgule flottante de 32 bits.
Le tableau suivant montre la précision et la plage approximative pour le type float.

Type Plage Size Type .NET
float ±1,5 x 10-45
±3,4 x 1038
~6-9 chiffres System.Single
Littéraux
Par défaut, un littéral numérique réel sur le côté droit de l'opérateur d'assignation est traité comme un double. Par conséquent, pour initialiser une variable de type float, utilisez le suffixe f ou F, comme dans l'exemple suivant :

Si vous n'utilisez pas de suffixe dans la déclaration précédente, vous obtiendrez une erreur de compilation, puisque vous essayez de stocker une valeur double dans une variable float.

Conversions
Vous pouvez combiner des types numériques intégraux et des types virgule flottante dans une expression. Dans ce cas, les types intégraux sont convertis en types virgule flottante. L'évaluation de l'expression est exécutée d'après les règles suivantes :

  • Si l'un des types virgule flottante est double, l'expression prend la valeur double, ou bool dans les comparaisons relationnelles ou les comparaisons d'égalité.
  • S'il n'y a aucun type double dans l'expression, elle prend la valeur float, ou bool dans les comparaisons relationnelles ou les comparaisons d'égalité.

Une expression à virgule flottante peut contenir les ensembles de valeurs suivants :

  • Zéro positif et négatif
  • Infini positif et négatif
  • Valeur NaN (N'est pas un nombre)
  • L'ensemble fini de valeurs différentes de zéro
Exemple
Dans l'exemple suivant, un int, un short et un float sont inclus dans une expression mathématique produisant un résultat float. (N'oubliez pas que float est un alias du type System.Single.) Notez qu'il n'y a aucune valeur double dans l'expression.
dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

int

int désigne un type intégral qui stocke des valeurs en fonction de la taille et de la plage indiquées dans le tableau suivant.

Type Plage Size Type .NET
int -2,147,483,648
2,147,483,647
Entier 32 bits signé System.Int32
Littéraux
Vous pouvez déclarer et initialiser une variable int en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Si le littéral entier est en dehors de la plage autorisée pour le type int (autrement dit, s'il est inférieur à Int32.MinValue ou supérieur à Int32.MaxValue), une erreur de compilation se produit.

Dans l'exemple suivant, les entiers égaux à 90 946 représentés comme des littéraux décimaux, hexadécimaux et binaires sont assignés aux valeurs int.

Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Conversions
Il existe une conversion implicite prédéfinie de int en long, float, double ou decimal. Par exemple :

Il existe une conversion implicite prédéfinie de sbyte, byte, short, ushort ou char en int. Par exemple, l'instruction d'assignation suivante génère une erreur de compilation sans cast :

Remarquez également qu'il n'existe pas de conversion implicite des types virgule flottante en int. Par exemple, l'instruction suivante génère une erreur du compilateur à moins qu'un cast explicite soit utilisé :

long

long désigne un type intégral qui stocke des valeurs en fonction de la taille et de la plage indiquées dans le tableau suivant.

Type Plage Size Type .NET
long -9 223 372 036 854 775 808
9 223 372 036 854 775 807
Entier 64 bits signé System.Int64
Littéraux
Vous pouvez déclarer et initialiser une variable long en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0).
Dans l'exemple suivant, les entiers égaux à 4 294 967 296 représentés comme des littéraux décimaux, hexadécimaux et binaires sont assignés aux valeurs long.

Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Les littéraux entiers peuvent également inclure un suffixe qui désigne le type. Le suffixe L désigne un type long. L'exemple suivant utilise le suffixe L pour désigner un entier long :
Vous pouvez aussi utiliser la lettre minuscule "l" comme suffixe. Ceci génère cependant un avertissement du compilateur, car la lettre "l" peut être facilement confondue avec le chiffre "1". Utilisez "L" pour plus de clarté.

Quand vous utilisez le suffixe "L", le type du littéral entier est déterminé comme étant long ou ulong, en fonction de sa taille. Dans ce cas, le type est long, car le littéral est inférieur à la plage de ulong.

Quand un littéral entier n'a pas de suffixe, son type est le premier des types suivants dans lesquels sa valeur peut être représentée :

  • int
  • uint
  • long
  • ulong

Conversions
Il existe une conversion implicite prédéfinie de long en float, double ou decimal. Dans le cas contraire, vous devez utiliser un cast. Par exemple, l'instruction suivante génère une erreur de compilation sans un cast explicite :

Il existe une conversion implicite prédéfinie de sbyte, byte, short, ushort, int, uint ou char vers long. Notez aussi qu'il n'existe pas de conversion implicite des types virgule flottante vers long. Par exemple, l'instruction suivante génère une erreur du compilateur, sauf si vous utilisez un cast explicite :

dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

sbyte

sbyte désigne un type intégral qui stocke des valeurs en fonction de la taille et de la plage indiquées dans le tableau suivant.
Type Plage Size Type .NET
sbyte -128
127
Entier 8 bits signé System.SByte
Littéraux
Vous pouvez déclarer et initialiser une variable sbyte en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Dans l'exemple suivant, les entiers égaux à -102 représentés comme des littéraux décimaux, hexadécimaux et binaires sont convertis à partir de valeurs int en valeurs sbyte.
Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Conversions
Il existe une conversion implicite prédéfinie de sbyte en short, int, long, float, double ou decimal. Vous ne pouvez pas convertir implicitement des types numériques non littéraux de taille de stockage supérieure à sbyte Considérons, par exemple, les deux variables sbyte x et y suivantes :

L'instruction d'assignation suivante entraîne une erreur de compilation, car l'expression arithmétique située à droite de l'opérateur d'assignation correspond à int par défaut.

Pour corriger ce problème, castez l'expression comme dans l'exemple suivant :

Il est cependant possible d'utiliser les instructions suivantes dans lesquelles la variable de destination a une taille de stockage égale ou supérieure :

Notez aussi qu'il n'existe pas de conversion implicite des types virgule flottante en sbyte. Par exemple, l'instruction suivante génère une erreur du compilateur, sauf si vous utilisez un cast explicite :

dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

short

short désigne un type de données intégral qui stocke des valeurs en fonction de la taille et de la plage indiquées dans le tableau suivant.

Type Plage Size Type .NET
short -32 768
32 767
Entier 16 bits signé System.Int16
Littéraux
Vous pouvez déclarer et initialiser une variable short en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Si le littéral entier est en dehors de la plage autorisée pour le type short (autrement dit, s'il est inférieur à Int16.MinValue ou supérieur à Int16.MaxValue), une erreur de compilation se produit.

Dans l'exemple suivant, les entiers égaux à 1 034 représentés comme des littéraux décimaux, hexadécimaux et binaires sont implicitement convertis à partir de valeurs int en short.


Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Conversions
Il existe une conversion implicite prédéfinie de short en int, long, float, double ou decimal. Vous ne pouvez pas convertir implicitement des types numériques non littéraux de taille de stockage supérieure à short. Prenez l'exemple des deux variables short x et y suivantes :
L'instruction d'assignation suivante entraîne une erreur de compilation, car l'expression arithmétique située à droite de l'opérateur d'assignation donne la valeur int par défaut.
Pour corriger ce problème, utilisez un cast :
Il est toutefois possible d'utiliser les instructions suivantes, dans lesquelles la variable de destination a une taille de stockage égale ou supérieure :
Il n'existe pas de conversion implicite des types virgule flottante en short. Par exemple, l'instruction suivante génère une erreur du compilateur, sauf si vous utilisez un cast explicite :
dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

struct

Un type struct est un type valeur utilisé pour encapsuler de petits groupes de variables liées, par exemple les coordonnées d'un rectangle ou les caractéristiques d'un élément dans un inventaire. L'exemple suivant illustre une déclaration struct simple.

uint

Le mot clé uint désigne un type intégral qui stocke des valeurs en fonction de la taille et de la plage indiquées dans le tableau suivant.

Type Plage Size Type .NET
uint 0
4 294 967 295
Entier 32 bits signé System.UInt32
Note : Le type uint n'est pas conforme CLS. Utilisez int autant que possible.

Littéraux
Vous pouvez déclarer et initialiser une variable uint en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Si le littéral entier est en dehors de la plage autorisée pour le type uint (autrement dit, s'il est inférieur à UInt32.MinValue ou supérieur à UInt32.MaxValue), une erreur de compilation se produit. Dans l'exemple suivant, les entiers égaux à 3 000 000 000 représentés comme des littéraux décimaux, hexadécimaux et binaires sont assignés aux valeurs uint.
Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Conversions
Il existe une conversion implicite prédéfinie de uint en long, ulong, float, double et decimal. Par exemple :

Il existe une conversion implicite prédéfinie de byte, ushort ou char en uint. Dans le cas contraire, vous devez utiliser un cast. Par exemple, l'instruction d'assignation suivante génère une erreur de compilation sans cast :

Remarquez également qu'il n'existe pas de conversion implicite des types virgule flottante en uint. Par exemple, l'instruction suivante génère une erreur du compilateur, sauf si vous utilisez un cast explicite :
dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

ulong

Le mot clé ulong désigne un type intégral qui stocke des valeurs en fonction de la taille et de la plage indiquées dans le tableau suivant.

Type Plage Size Type .NET
ulong 0
18 446 744 073 709 551 615
Entier 64 bits non signé System.UInt64
Littéraux
Vous pouvez déclarer et initialiser une variable ulong en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Si le littéral entier est en dehors de la plage autorisée pour le type ulong (autrement dit, s'il est inférieur à UInt64.MinValue ou supérieur à UInt64.MaxValue), une erreur de compilation se produit. Dans l'exemple suivant, les entiers égaux à 7 934 076 125 représentés comme des littéraux décimaux, hexadécimaux et binaires sont assignés aux valeurs ulong.
Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Conversions
Il existe une conversion implicite prédéfinie de ulong en float, double ou decimal.

Il n'existe aucune conversion implicite de ulong en un type intégral. Par exemple, l'instruction suivante génère une erreur de compilation sans cast explicite :


Il existe une conversion implicite prédéfinie de byte, ushort, uint ou char en ulong.

De plus, il n'existe pas de conversion implicite des types virgule flottante en ulong. Par exemple, l'instruction suivante génère une erreur du compilateur, sauf si vous utilisez un cast explicite :
dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza

ushort

Le mot clé ushort indique un type de données intégral qui stocke des valeurs selon la taille et la plage indiquées dans le tableau suivant.

Type Plage Size Type .NET
ushort 0
65 535
Entier 16 bits non signé System.UInt16
Littéraux
Vous pouvez déclarer et initialiser une variable ushort en lui assignant un littéral décimal, hexadécimal ou binaire (à compter de C# 7.0). Si le littéral entier est en dehors de la plage autorisée pour le type ushort (autrement dit, s'il est inférieur à UInt16.MinValue ou supérieur à UInt16.MaxValue), une erreur de compilation se produit.

Dans l'exemple suivant, les entiers égaux à 65 034 représentés comme des littéraux décimaux, hexadécimaux et binaires sont implicitement convertis à partir de valeurs int en ushort.
Vous utilisez le préfixe 0x ou 0X pour désigner un littéral hexadécimal, et le préfixe 0b ou 0B pour désigner un littéral binaire. Les littéraux décimaux n'ont pas de préfixe.

Conversions
Il existe une conversion implicite prédéfinie de ushort en int, uint, long, ulong, float, double ou decimal.

Il existe une conversion implicite prédéfinie de byte ou char en ushort. Sinon, vous devez utiliser un cast pour effectuer une conversion explicite. Considérons, par exemple, les deux variables ushort x et y suivantes :

L'instruction d'assignation suivante entraîne une erreur de compilation, car l'expression arithmétique située à droite de l'opérateur d'assignation donne la valeur int par défaut.

Pour corriger ce problème, utilisez un cast :

Il est cependant possible d'utiliser les instructions suivantes dans lesquelles la variable de destination a une taille de stockage égale ou supérieure :

Notez aussi qu'il n'existe pas de conversion implicite des types virgule flottante en ushort. Par exemple, l'instruction suivante génère une erreur du compilateur, sauf si vous utilisez un cast explicite :

dzadzadadzadza
dzadzadzadza
zadazdzadza
dazdza