Tipos nativos para iOS y macOS

Las API de Mac e iOS usan tipos de datos específicos de la arquitectura que siempre son de 32 bits en plataformas de 32 bits y de 64 bits en plataformas de 64 bits.

Por ejemplo, Objective-C asigna el tipo de datos NSInteger a int32_t en sistemas de 32 bits y a int64_t en sistemas de 64 bits.

Para igualar este comportamiento, en nuestra API unificada, reemplazamos los usos anteriores de int (que en .NET se define siempre como System.Int32) por un nuevo tipo de datos: System.nint. En este caso, "n" significa "nativo", por lo que se trata del tipo entero nativo de la plataforma.

Con estos nuevos tipos de datos, se compila el mismo código fuente para arquitecturas de 32 y 64 bits, en función de las marcas de compilación.

Nuevos tipos de datos

En la tabla siguiente se muestran los cambios en nuestros tipos de datos para que coincidan con este nuevo mundo de 32/64 bits:

Tipo nativo Tipo de respaldo de 32 bits Tipo de respaldo de 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)

Hemos elegido esos nombres para permitir que el código de C# tenga más o menos el mismo aspecto que tendría actualmente.

Conversiones implícitas y explícitas

El diseño de los nuevos tipos de datos está pensado para permitir que un único archivo de código fuente de C# use naturalmente almacenamiento de 32 o 64 bits en función de la plataforma host y la configuración de compilación.

Esto nos obliga a diseñar un conjunto de conversiones implícitas y explícitas a y desde los tipos de datos específicos de la plataforma a los tipos de datos enteros y de punto flotante de .NET.

Los operadores de conversiones implícitas se proporcionan cuando no hay posibilidad de pérdida de datos (valores de 32 bits que se almacenan en un espacio de 64 bits).

Los operadores de conversiones explícitas se proporcionan cuando hay una posibilidad de pérdida de datos (un valor de 64 bits se almacena en una ubicación de almacenamiento de 32 bits o potencialmente de 32 bits).

int, uint y float se pueden convertir implícitamente en nint, nuint y nfloat, ya que los valores de 32 bits siempre caben en almacenamiento de 32 o 64 bits.

nint, nuint y nfloat se pueden convertir implícitamente en long, ulong y double, ya que los valores de 32 o 64 bits siempre caben en almacenamiento de 64 bits.

Debe convertir explícitamente nint, nuint y nfloat en int, uint y float, ya que los tipos nativos pueden contener 64 bits de almacenamiento.

Debe convertir explícitamente long, ulong y double en nint, nuint y nfloat, ya que es posible que los tipos nativos solo puedan contener 32 bits de almacenamiento.

Tipos CoreGraphics

Los tipos de datos de punto, tamaño y rectángulo que se usan con CoreGraphics emplean 32 o 64 bits en función del dispositivo en el que se ejecutan. Cuando enlazamos originalmente las API de iOS y Mac, usamos estructuras de datos existentes que coincidían con los tamaños de la plataforma host (los tipos de datos de System.Drawing).

Al pasar a Unified, deberá reemplazar las instancias de System.Drawing por sus homólogos de CoreGraphics, tal y como se muestra en la tabla siguiente:

Tipo antiguo en System.Drawing Nuevo tipo de datos de CoreGraphics Descripción
RectangleF CGRect Contiene información del rectángulo de punto flotante.
SizeF CGSize Contiene información del tamaño de punto flotante (ancho, altura)
PointF CGPoint Contiene información del punto de punto flotante (X, Y)

Los tipos de datos antiguos usan floats para almacenar los elementos de las estructuras de datos, mientras que los tipos nuevos usan System.nfloat.