boxing
et unboxing
dynamic
bytes
en int
Des chercheurs danois et suédois en sciences informatiques et systèmes autonomes ont décortiqué la sécurité...
Nvidia se prépare à livrer la plate-forme serveur HGX-2 qui sera capable d'exploiter la puissance de 16 GPU Tesla V100...
L'EMD, une école de commerce située à Marseille ouvre à la prochaine rentrée l'école du numérique...
string
ne peut pas être converti implicitement en int
.
Après avoir déclaré i
comme int
, vous ne pouvez donc pas lui assigner la chaîne "Hello"
, comme l'illustre le code suivant :"conversions de types"
.
En C#, vous pouvez effectuer les conversions suivantes :System.DateTime
ou des chaînes hexadécimales et des tableaux d'octets,
vous pouvez utiliser la classe System.BitConverter
, la classe System.Convert
et les méthodes Parse
des types numériques intégrés,
comme Int32.Parse
. long
(entier sur 64 bits) peut stocker n'importe quelle valeur pouvant être stockée par un int
(entier sur 32 bits).
Dans l'exemple suivant, le compilateur convertit implicitement la valeur de num
à droite en type long
avant de l'assigner à bigNum
.double
en int
. Le programme ne se compile pas sans le cast.InvalidCastException
.is
et as
pour vous permettre de tester la compatibilité avant d'effectuer réellement un cast.System.Object
, et la stocke sur le tas managé.
L'unboxing extrait le type valeur de l'objet. La conversion boxing est implicite ; la conversion unboxing est explicite.
Le concept de boxing et de unboxing repose sur la vue unifiée par C# du système de type,
dans lequel une valeur de n'importe quel type peut être traitée en tant qu'objet.i
est convertie (boxed) et assignée à l'objet o
.o
peut ensuite être unboxed et assigné à la variable de type entier i
:i
:o
qui fait référence à une valeur de type int
sur le tas.
Cette valeur est une copie de la valeur de type valeur qui a été assignée à la variable i
.
La différence entre les deux variables, i
et o
, est illustrée dans la figure ci-dessous.i
(entier) en un objet o
.
Ensuite, la valeur i
stockée dans la variable 123
est remplacée par la valeur 456
.
L'exemple montre que le type valeur d'origine et que l'objet boxed utilisent des emplacements de mémoire distincts et peuvent, par conséquent, stocker des valeurs différentes.null
provoque un NullReferenceException
.
La tentative d'extraction d'une référence vers un type de valeur incompatible provoque un InvalidCastException
.InvalidCastException
qui en résulte.
Avec try
et catch
, un message d'erreur est affiché lorsque l'erreur se produit.Specified cast is not valid. Error: Incorrect unboxing.
Unboxing OK.
dynamic
.
Il s'agit d'un type statique ; toutefois, un objet de type dynamic
ignore la vérification des types statiques.
Dans la plupart des cas, il fonctionne comme s'il était de type object
.
Au moment de la compilation, un élément de type dynamic
est supposé prendre en charge n'importe quelle opération.
Par conséquent, vous n'avez pas besoin de vous demander si l'objet obtient sa valeur d'une API COM
, d'un langage dynamique tel que IronPython
,
du modèle DOM (Document Object Model) HTML
, de la réflexion ou d'une autre partie du programme.
Toutefois, si le code n'est pas valide, des erreurs sont détectées au moment de l'exécution.exampleMethod1
du code suivant ne comporte qu'un seul paramètre, le compilateur reconnaît
que le premier appel à la méthode, ec.exampleMethod1(10, 4)
, n'est pas valide car il contient deux arguments.
Cet appel entraîne une erreur du compilateur. Le deuxième appel à la méthode, dynamic_ec.exampleMethod1(10, 4)
, n'est pas vérifié par le compilateur,
car le type de dynamic_ec
est dynamic
. Par conséquent, aucune erreur de compilateur n'est signalée.
Toutefois, l'erreur ne passe pas indéfiniment inaperçue.
Elle est détectée au moment de l'exécution et provoque une exception runtime.dynamic
.
Au moment de l'exécution, les informations stockées sont examinées, et toute instruction non valide provoque une exception runtime.dynamic
.
Par exemple, si vous placez le pointeur de la souris sur testSum
dans l'exemple suivant, IntelliSense
affiche le type (variable locale) dynamic testSum
.dynamic
incluent :dynamic
vers un autre type.dynamic
.testInstance
dans la déclaration suivante est ExampleClass
, et non pas dynamic
:dynamic
.dynamic
, ou si le récepteur de l'appel de méthode est de type dynamic
. Dans l'exemple suivant,
si la seule méthode exampleMethod2
accessible est définie pour accepter un argument de chaîne, l'envoi de d1 en tant qu'argument
n'entraîne pas d'erreur du compilateur, mais provoque une exception runtime. La résolution de surcharge échoue au moment de
l'exécution car le type de d1
est int
, et exampleMethod2
exige une chaîne.dynamic
en C#, ainsi que l'implémentation des langages de programmation dynamique tels que IronPython
et IronRuby
.dynamic
et des arguments nommés et facultatifs fait partie des améliorations offertes./link
(Options du compilateur C#), l'introduction du type dynamic
vous permet de traiter les
occurrences d'object dans les signatures COM comme si elles étaient de type dynamic
, vous évitant ainsi une grande partie des opérations de cast.
Par exemple, les instructions suivantes permettent de comparer la façon dont vous accédez à une cellule d'une feuille de
calcul Microsoft Office Excel avec le type dynamic
et sans le type dynamic
.BitConverter
pour convertir un tableau d'octets en valeur int
, puis la reconvertir en tableau d'octets.
Vous devrez peut-être convertir des octets en un type de données intégré après avoir lu les octets sur le réseau.
Outre la méthode ToInt32(Bytre[], Int32)
de l'exemple, le tableau suivant répertorie les méthodes dans la classe BitConverter
qui
convertissent des octets (d'un tableau d'octets) en d'autres types intégrés.Type numérique | Méthode |
---|---|
bool |
ToBoolean(Byte[], Int32) |
char |
ToChar(Byte[], Int32) |
double |
ToDouble(Byte[], Int32) |
short |
ToInt16(Byte[], Int32) |
int |
ToInt32(Byte[], Int32) |
long |
ToInt64(Byte[], Int32) |
float |
ToSingle(Byte[], Int32) |
ushort |
ToUInt16(Byte[], Int32) |
uint |
ToUInt32(Byte[], Int32) |
ulong |
ToUInt64(Byte[], Int32) |
ToInt32(Byte[], Int32)
pour convertir quatre octets du tableau en valeur int
. Le deuxième argument de ToInt32(Byte[], Int32)
spécifie l'index de départ du tableau d'octets.GetBytes(Int32)
de la classe BitConverter
est appelée pour convertir une valeur int
en tableau d'octets.Parse
ou TryParse
des différents types numériques (int, long, double
, etc.),
ou bien en utilisant des méthodes dans la classe System.Convert
.TryParse
(par exemple int.TryParse("11", out number)
)
ou une méthode Parse
(par exemple, var number = int.Parse("11")
).
L'utilisation d'une méthode Convert
s'avère plus utile pour les objets généraux qui implémentent IConvertible
.Parse
ou TryParse
sur le type numérique que doit contenir la chaîne, notamment le type System.Int32
.
La méthode Convert.ToInt32
utilise Parse
en interne.
La méthode Parse
retourne le nombre converti; la méthode TryParse
retourne une valeur Boolean
qui indique si la conversion a réussi et retourne le nombre converti dans un outparamètre. Si le format de la chaîne n'est pas valide,
Parse
lève une exception, tandis que TryParse
retourne false
. Lorsque vous appelez une méthode Parse
, vous devez toujours utiliser la
gestion des exceptions pour intercepter une FormatException
si l'opération d'analyse échoue.Parse
et TryParse
ignorent l'espace blanc au début et à la fin de la chaîne,
mais tous les autres caractères doivent être des caractères qui forment le type numérique approprié (int, long, ulong, float, decimal
, etc.).
La présence d'un espace blanc dans la chaîne qui forme le nombre génère une erreur. Par exemple, vous pouvez utiliser decimal.TryParse
pour analyser 10
, 10.3
, 10
, mais vous ne pouvez pas utiliser cette méthode pour analyser 10
à
partir de 10X
, 1 0
(notez l'espace incorporé), 10 .3
(notez l'espace incorporé),
10e1
(float.TryParse
fonctionne ici), et ainsi de suite. Par ailleurs, une chaîne dont la valeur est null
ou String.Empty
ne parvient pas
à effectuer une analyse. Vous pouvez rechercher une chaîne Null ou vide avant de tenter de l'analyser en appelant la méthode String.IsNullOrEmpty
.Parse
et à TryParse
qui ont réussi ou échoué.TryParse
.
étant donné que les chaînes à analyser contiennent un petit nombre de caractères, l'exemple appelle la méthode String.Concat
pour attribuer des caractères
valides à une nouvelle chaîne. Pour une chaîne plus grande, la classe StringBuilder
peut être utilisée à la place.Convert
que vous pouvez utiliser pour convertir une chaîne en nombre.Type numérique | Méthode |
---|---|
decimal |
ToDecimal(String) |
float |
ToSingle(String) |
double |
ToDouble(String) |
short |
ToInt16(String) |
int |
ToInt32(String) |
long |
ToInt64(String) |
ushort |
ToUInt16(String) |
uint |
ToUInt32(String) |
ulong |
ToUInt64(String) |
Convert.ToInt32(String)
pour convertir une entrée de type chaîne en int
.
L'exemple intercepte les deux exceptions les plus communes qui peuvent être levées par cette méthode, FormatException
et OverflowException
.
Si le nombre obtenu peut être incrémenté sans dépasser Int32.MaxValue
, l'exemple ajoute 1
au résultat et affiche la sortie.string
).char
qui correspond à chaque valeur d'une chaîne hexadécimale.int
.float
.string
hexadécimale.string
.
Il convertit d'abord la string
en un tableau de caractères.
Ensuite, il appelle ToInt32(Char)
sur chaque caractère afin d'obtenir sa valeur numérique.
Pour finir, il représente le nombre sous forme hexadécimale dans une string
.string
de valeurs hexadécimales et génère le caractère correspondant à chacune d'elles.
Il appelle d'abord la méthode Split(Char[])
pour obtenir chaque valeur hexadécimale sous la forme d'une string
individuelle dans un tableau.
Ensuite, il appelle ToInt32(String, Int32)
pour convertir la valeur hexadécimale en valeur décimale représentée sous forme d'objet int
.
Il illustre deux manières d'obtenir le caractère correspondant à ce code de caractère.
La première technique utilise string
, qui retourne le caractère correspondant à l'argument entier sous forme de ConvertFromUtf32(Int32)
.
La deuxième technique effectue un cast explicite de int
en char
.string
hexadécimal en entier, en appelant la méthode Parse(String, NumberStyles)
.string
hexadécimal en float à l'aide de la classe System.BitConverter
et de la méthode UInt32.Parse
.octets
en chaîne hexadécimale à l'aide de la classe System.BitConverter
.