Typy natywne dla systemów iOS i macOS
Interfejsy API dla komputerów Mac i iOS używają typów danych specyficznych dla architektury, które są zawsze 32 bitami na platformach 32-bitowych i 64 bitach na platformach 64-bitowych.
Na przykład Objective-C mapuje NSInteger
typ danych na int32_t
systemy 32-bitowe i int64_t
na systemy 64-bitowe.
Aby dopasować to zachowanie, w naszym ujednoliconym interfejsie API zastępujemy poprzednie zastosowania int
(które na platformie .NET są zdefiniowane jako zawsze System.Int32
) na nowy typ danych: System.nint
. Możesz traktować "n" jako "natywny", więc natywny typ liczby całkowitej platformy.
W przypadku tych nowych typów danych ten sam kod źródłowy jest kompilowany dla architektur 32-bitowych i 64-bitowych, w zależności od flag kompilacji.
Nowe typy danych
W poniższej tabeli przedstawiono zmiany w typach danych zgodne z tym nowym światem 32/64-bitowym:
Typ natywny | Typ kopii zapasowej 32-bitowej | Typ kopii zapasowej 64-bitowej |
---|---|---|
System.nint |
System.Int32 (int ) |
System.Int64 (long ) |
System.nuint |
System.UInt32 (uint ) |
System.UInt64 (ulong ) |
System.nfloat |
System.Single (float ) |
System.Double (double ) |
Wybraliśmy te nazwy, aby umożliwić kodowi języka C# wygląd mniej więcej w taki sam sposób, jak dzisiaj.
Konwersje jawne i niejawne
Projekt nowych typów danych ma na celu umożliwienie naturalnego używania 32 lub 64-bitowego magazynu w jednym pliku źródłowym języka C# w zależności od platformy hosta i ustawień kompilacji.
Wymaga to od nas zaprojektowania zestawu niejawnych i jawnych konwersji do i z typów danych specyficznych dla platformy do typu danych całkowitych i zmiennoprzecinkowych platformy .NET.
Operatory konwersji niejawnych są udostępniane, gdy nie ma możliwości utraty danych (wartości 32-bitowe przechowywane na 64-bitowym miejscu).
Operatory konwersji jawnych są udostępniane, gdy istnieje możliwość utraty danych (wartość 64-bitowa jest przechowywana w lokalizacji magazynu 32 lub potencjalnie 32).
int
, uint
i float
są niejawnie konwertowane na nint
, nuint
a nfloat
ponieważ 32 bity zawsze mieszczą się w 32 lub 64 bitach.
nint
i nuint
nfloat
są niejawnie konwertowane na long
, ulong
a double
jako wartości 32 lub 64-bitowe będą zawsze mieścić się w 64-bitowym magazynie.
Należy użyć jawnych konwersji z nint
, nuint
i nfloat
do int
, uint
a float
ponieważ typy natywne mogą przechowywać 64 bity magazynu.
Należy użyć jawnych konwersji z long
, ulong
i double
do nint
, nuint
a nfloat
ponieważ typy natywne mogą być w stanie przechowywać tylko 32 bity magazynu.
Typy CoreGraphics
Typy danych punktów, rozmiarów i prostokątów, które są używane w usłudze CoreGraphics, używają 32 lub 64 bitów w zależności od urządzenia, na którym są uruchomione. Kiedy pierwotnie powiązaliśmy interfejsy API systemów iOS i Mac, użyliśmy istniejących struktur danych, które były zgodne z rozmiarami platformy hosta (typy danych w System.Drawing
programie ).
Podczas przechodzenia do programu Unified należy zastąpić wystąpienia ich CoreGraphics
odpowiednikamiSystem.Drawing
, jak pokazano w poniższej tabeli:
Stary typ w pliku System.Drawing | Nowy typ danych CoreGraphics | opis |
---|---|---|
RectangleF |
CGRect |
Przechowuje informacje o prostokątach zmiennoprzecinkowych. |
SizeF |
CGSize |
Zawiera informacje o rozmiarze zmiennoprzecinkowe (szerokość, wysokość) |
PointF |
CGPoint |
Przechowuje zmiennoprzecinkę, informacje o punkcie (X, Y) |
Stare typy danych używały zmiennoprzecinkowych do przechowywania elementów struktur danych, podczas gdy nowy używa metody System.nfloat
.