Tipi nativi per iOS e macOS
Le API Mac e iOS usano tipi di dati specifici dell'architettura che sono sempre a 32 bit su piattaforme a 32 bit e 64 bit su piattaforme a 64 bit.
Ad esempio, Objective-C esegue il mapping del NSInteger
tipo di dati a nei sistemi a int32_t
32 bit e in sistemi a int64_t
64 bit.
Per trovare la corrispondenza con questo comportamento, nell'API unificata si sostituiscono gli usi precedenti di int
(che in .NET è sempre System.Int32
definito come ) in un nuovo tipo di dati: System.nint
. È possibile considerare "n" come "nativo", quindi il tipo integer nativo della piattaforma.
Con questi nuovi tipi di dati, lo stesso codice sorgente viene compilato per le architetture a 32 bit e a 64 bit, a seconda dei flag di compilazione.
Nuovi tipi di dati
La tabella seguente illustra le modifiche apportate ai tipi di dati in modo che corrispondano a questo nuovo mondo a 32/64 bit:
Tipo nativo | Tipo di supporto a 32 bit | Tipo di supporto a 64 bit |
---|---|---|
System.nint |
System.Int32 (int ) |
System.Int64 (long ) |
System.nuint |
System.UInt32 (uint ) |
System.UInt64 (ulong ) |
System.nfloat |
System.Single (float ) |
System.Double (double ) |
Questi nomi sono stati scelti per consentire al codice C# di apparire più o meno allo stesso modo in cui dovrebbe sembrare oggi.
Conversioni implicite ed esplicite
La progettazione dei nuovi tipi di dati è progettata per consentire a un singolo file di origine C# di usare naturalmente l'archiviazione a 32 o 64 bit a seconda della piattaforma host e delle impostazioni di compilazione.
Ciò ci ha richiesto di progettare un set di conversioni implicite ed esplicite in e dai tipi di dati specifici della piattaforma ai tipi di dati integrali e a virgola mobile .NET.
Gli operatori di conversioni implicite vengono forniti quando non esiste alcuna possibilità di perdita di dati (valori a 32 bit archiviati in uno spazio a 64 bit).
Gli operatori di conversioni espliciti vengono forniti quando si verifica una potenziale perdita di dati (il valore a 64 bit viene archiviato in una posizione di archiviazione di 32 o potenzialmente 32).
int
uint
, e float
sono tutti convertibili in modo implicito in nint
e nuint
nfloat
come 32 bit si adattano sempre a 32 o 64 bit.
nint
nuint
, e nfloat
sono tutti convertibili in modo implicito in long
ulong
e double
come valori a 32 o 64 bit saranno sempre adatti all'archiviazione a 64 bit.
È necessario usare conversioni esplicite da nint
nuint
e nfloat
in int
uint
e float
poiché i tipi nativi potrebbero contenere 64 bit di archiviazione.
È necessario usare conversioni esplicite da long
ulong
e double
in nint
nuint
e nfloat
poiché i tipi nativi potrebbero contenere solo 32 bit di archiviazione.
Tipi CoreGraphics
I tipi di dati point, size e rectangle usati con CoreGraphics usano 32 o 64 bit a seconda del dispositivo in cui sono in esecuzione. Quando originariamente sono state associate le API iOS e Mac, sono state usate strutture di dati esistenti che corrispondono alle dimensioni della piattaforma host (i tipi di dati in System.Drawing
).
Quando si passa a Unified, sarà necessario sostituire le istanze di System.Drawing
con le rispettive CoreGraphics
controparti, come illustrato nella tabella seguente:
Tipo precedente in System.Drawing | Nuovo tipo di dati CoreGraphics | Descrizione |
---|---|---|
RectangleF |
CGRect |
Contiene informazioni sul rettangolo a virgola mobile. |
SizeF |
CGSize |
Contiene informazioni sulle dimensioni a virgola mobile (larghezza, altezza) |
PointF |
CGPoint |
Contiene un valore a virgola mobile, informazioni sul punto (X, Y) |
I tipi di dati precedenti usati per archiviare gli elementi delle strutture di dati, mentre quello nuovo usa System.nfloat
.