Native Typen für iOS und macOS

Mac- und iOS-APIs verwenden architekturspezifische Datentypen, die immer 32 Bit auf 32-Bit-Plattformen und 64 Bit auf 64-Bit-Plattformen sind.

Der NSInteger Datentyp int32_t wird beispielsweise Objective-C auf 32-Bit-Systemen und int64_t auf 64-Bit-Systemen zugeordnet.

Um diesem Verhalten zu entsprechen, ersetzen wir in unserer einheitlichen API die vorherigen Verwendungen von int (die in .NET als immer System.Int32definiert ist) durch einen neuen Datentyp: System.nint. Sie können sich "n" als "native" vorstellen, also den nativen ganzzahligen Typ der Plattform.

Bei diesen neuen Datentypen wird der gleiche Quellcode für 32-Bit- und 64-Bit-Architekturen kompiliert, abhängig von Ihren Kompilierungsflags.

Neue Datentypen

Die folgende Tabelle zeigt die Änderungen an unseren Datentypen, die dieser neuen 32/64-Bit-Welt entsprechen:

Nativer Typ 32-Bit-Unterstützungstyp 64-Bit-Unterstützungstyp
System.nint System.Int32 (int) System.Int64 (long)
System.nuint System.UInt32 (uint) System.UInt64 (ulong)
System.nfloat System.Single (float) System.Double (double)

Wir haben diese Namen ausgewählt, damit Ihr C#-Code mehr oder weniger genauso aussieht wie heute.

Implizite und explizite Konvertierungen

Der Entwurf der neuen Datentypen soll es einer einzelnen C#-Quelldatei ermöglichen, abhängig von der Hostplattform und den Kompilierungseinstellungen natürlich 32- oder 64-Bit-Speicher zu verwenden.

Dazu mussten wir einen Satz impliziter und expliziter Konvertierungen in und von den plattformspezifischen Datentypen in die .NET-Datentypen "Integral" und "Gleitkomma" entwerfen.

Implizite Konvertierungsoperatoren werden bereitgestellt, wenn keine Möglichkeit für Datenverlust besteht (32-Bit-Werte werden auf einem 64-Bit-Speicher gespeichert).

Explizite Konvertierungsoperatoren werden bereitgestellt, wenn ein Potenzieller Datenverlust besteht (der 64-Bit-Wert wird an einem 32- oder potenziell 32-Speicherort gespeichert).

int, uint und float sind alle implizit in nintkonvertierbar, nuint und nfloat da 32 Bits immer in 32 oder 64 Bits passen.

nint, nuint und nfloat sind alle implizit in longkonvertiert, ulong und double da 32- oder 64-Bit-Werte immer in 64-Bit-Speicher passen.

Sie müssen explizite Konvertierungen von nintund nuintnfloat in intverwenden, uint da float die nativen Typen möglicherweise 64 Bit Speicher enthalten.

Sie müssen explizite Konvertierungen von longund ulongdouble in nintverwenden, nuint da nfloat die nativen Typen möglicherweise nur 32 Bit Speicher enthalten können.

CoreGraphics-Typen

Die mit CoreGraphics verwendeten Datentypen Punkt, Größe und Rechteck verwenden je nach Gerät, auf dem sie ausgeführt werden, 32 oder 64 Bit. Als wir die iOS- und Mac-APIs ursprünglich gebunden haben, haben wir vorhandene Datenstrukturen verwendet, die den Größen der Hostplattform entsprechen (Die Datentypen in System.Drawing).

Wenn Sie zu Unified wechseln, müssen Sie Instanzen von System.Drawing durch ihre CoreGraphics Entsprechungen ersetzen, wie in der folgenden Tabelle gezeigt:

Alter Typ in System.Drawing Neuer Datentyp CoreGraphics BESCHREIBUNG
RectangleF CGRect Enthält Gleitkommarechteckinformationen.
SizeF CGSize Enthält Gleitkommagrößeninformationen (Breite, Höhe)
PointF CGPoint Enthält eine Gleitkomma- und Punktinformation (X, Y)

Die alten Datentypen, die zum Speichern der Elemente der Datenstrukturen verwendet wurden, während der neue Datentyp verwendet wird System.nfloat.