Partager via


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.Int32toujours ) 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 ninten , nuint et nfloat comme 32 bits s’ajustent toujours dans 32 ou 64 bits.

nint, nuint et nfloat sont tous implicitement convertibles longen , 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.