Condividi tramite


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.Int32definito 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).

intuint, e float sono tutti convertibili in modo implicito in ninte nuintnfloat come 32 bit si adattano sempre a 32 o 64 bit.

nintnuint, e nfloat sono tutti convertibili in modo implicito in longulong e double come valori a 32 o 64 bit saranno sempre adatti all'archiviazione a 64 bit.

È necessario usare conversioni esplicite da nintnuint e nfloat in intuint e float poiché i tipi nativi potrebbero contenere 64 bit di archiviazione.

È necessario usare conversioni esplicite da longulong e double in nintnuint 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.