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.Int32
definiert 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 nint
konvertierbar, nuint
und nfloat
da 32 Bits immer in 32 oder 64 Bits passen.
nint
, nuint
und nfloat
sind alle implizit in long
konvertiert, ulong
und double
da 32- oder 64-Bit-Werte immer in 64-Bit-Speicher passen.
Sie müssen explizite Konvertierungen von nint
und nuint
nfloat
in int
verwenden, uint
da float
die nativen Typen möglicherweise 64 Bit Speicher enthalten.
Sie müssen explizite Konvertierungen von long
und ulong
double
in nint
verwenden, 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
.