Udostępnij za pośrednictwem


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.

ninti nuintnfloat 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.Drawingprogramie ).

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.