Types natifs pour iOS et macOS
Les API Mac et iOS utilisent des types de données spécifiques à l’architecture qui sont toujours 32 bits sur les plateformes 32 bits et 64 bits sur les plateformes 64 bits.
Par exemple, Objective-C mappe le NSInteger
type de données sur int32_t
les systèmes 32 bits et int64_t
sur les systèmes 64 bits.
Pour faire correspondre ce comportement, sur notre API unifiée, nous remplaçons les utilisations précédentes de int
(qui dans .NET est défini comme étant System.Int32
toujours ) par un nouveau type de données : System.nint
. Vous pouvez considérer le « n » comme signifiant « natif », c’est-à-dire le type entier natif de la plateforme.
Avec ces nouveaux types de données, le même code source est compilé pour les architectures 32 bits et 64 bits, en fonction de vos indicateurs de compilation.
Nouveaux types de données
Le tableau suivant montre les modifications apportées à nos types de données pour correspondre à ce nouveau monde 32/64 bits :
Type natif | Type de stockage 32 bits | Type de stockage 64 bits |
---|---|---|
System.nint |
System.Int32 (int ) |
System.Int64 (long ) |
System.nuint |
System.UInt32 (uint ) |
System.UInt64 (ulong ) |
System.nfloat |
System.Single (float ) |
System.Double (double ) |
Nous avons choisi ces noms pour permettre à votre code C# de ressembler plus ou moins à celui d’aujourd’hui.
Conversions implicites et explicites
La conception des nouveaux types de données est destinée à permettre à un seul fichier source C# d’utiliser naturellement le stockage 32 ou 64 bits en fonction de la plateforme hôte et des paramètres de compilation.
Cela nous a obligés à concevoir un ensemble de conversions implicites et explicites vers et depuis les types de données spécifiques à la plateforme vers les types de données intégrales et à virgule flottante .NET.
Les opérateurs de conversions implicites sont fournis lorsqu’il n’y a pas de possibilité de perte de données (les valeurs de 32 bits sont stockées sur un espace de 64 bits).
Des opérateurs de conversions explicites sont fournis lorsqu’il existe un risque de perte de données (une valeur de 64 bits est stockée sur un emplacement de stockage 32 ou potentiellement 32).
int
, uint
et float
sont tous implicitement convertibles nint
en , nuint
et nfloat
comme 32 bits s’ajustent toujours dans 32 ou 64 bits.
nint
, nuint
et nfloat
sont tous implicitement convertibles long
en , ulong
et double
comme les valeurs 32 ou 64 bits s’intègrent toujours dans le stockage 64 bits.
Vous devez utiliser des conversions explicites à partir de nint
, nuint
et nfloat
en int
, uint
et float
, car les types natifs peuvent contenir 64 bits de stockage.
Vous devez utiliser des conversions explicites à partir de long
, ulong
et double
en nint
, nuint
et nfloat
étant donné que les types natifs ne peuvent contenir que 32 bits de stockage.
CoreGraphics Types
Les types de données point, taille et rectangle utilisés avec CoreGraphics utilisent 32 ou 64 bits en fonction de l’appareil sur lequel ils s’exécutent. Lorsque nous avons initialement lié les API iOS et Mac, nous avons utilisé des structures de données existantes qui correspondent aux tailles de la plateforme hôte (types de données dans System.Drawing
).
Lorsque vous passez à Unified, vous devez remplacer les instances de System.Drawing
par leurs CoreGraphics
équivalents, comme indiqué dans le tableau suivant :
Ancien type dans System.Drawing | Nouveau type de données CoreGraphics | Description |
---|---|---|
RectangleF |
CGRect |
Contient des informations de rectangle à virgule flottante. |
SizeF |
CGSize |
Contient les informations de taille à virgule flottante (largeur, hauteur) |
PointF |
CGPoint |
Contient un point flottant, des informations de point (X, Y) |
Les anciens types de données utilisés floats pour stocker les éléments des structures de données, tandis que le nouveau utilise System.nfloat
.