iOS 和 macOS 的原生類型
Mac 和 iOS API 會使用 32 位平臺上一律為 32 位的架構特定數據類型,以及 64 位平臺上的 64 位。
例如, Objective-C 將 NSInteger
數據類型對應至 int32_t
32位系統上和 int64_t
64位系統上。
為了符合此行為,我們會在整合 API 上,將先前的用法int
取代為新的數據類型:System.Int32
System.nint
。 您可以將 「n」 視為「原生」,因此平臺的原生整數類型。
使用這些新的數據類型時,會根據編譯旗標,針對32位和64位架構編譯相同的原始碼。
新資料類型
下表顯示數據類型的變更,以符合這個新的 32/64 位世界:
原生類型 | 32 位備份類型 | 64 位備份類型 |
---|---|---|
System.nint |
System.Int32 (int ) |
System.Int64 (long ) |
System.nuint |
System.UInt32 (uint ) |
System.UInt64 (ulong ) |
System.nfloat |
System.Single (float ) |
System.Double (double ) |
我們選擇這些名稱,讓您的 C# 程式代碼看起來與今天看起來相同。
隱含和明確轉換
新數據類型的設計旨在根據主機平臺和編譯設定,讓單一 C# 來源檔案自然使用 32 或 64 位記憶體。
這需要我們設計一組隱含和明確的轉換,從平臺特定的數據類型到 .NET 整數和浮點數據類型。
當無法遺失數據時,會提供隱含轉換運算符(儲存在64位空間上的32位值)。
當可能會遺失數據時,會提供明確的轉換運算元(64 位值儲存在 32 或可能 32 個儲存位置上)。
int
、 uint
和 float
皆可隱含轉換成 nint
, nuint
而 nfloat
32 位一律會容納 32 或 64 位。
nint
、 nuint
和 nfloat
皆可隱含轉換成 long
, ulong
且 double
32 或 64 位值一律會容納在 64 位記憶體中。
您必須使用 從nint
和 nfloat
nuint
到int
的明確轉換,uint
而且float
因為原生類型可能會保存 64 位的記憶體。
您必須使用、 long
ulong
和 double
到 nint
的明確轉換,nfloat
nuint
因為原生類型可能只能保存 32 位的記憶體。
CoreGraphics 類型
與 CoreGraphics 搭配使用的點、大小和矩形數據類型會根據執行所在裝置使用 32 或 64 位。 當我們最初系結 iOS 和 Mac API 時,我們使用與主機平臺大小相符的現有數據結構(中的 System.Drawing
數據類型)。
移至 Unified 時,您必須將 的 System.Drawing
實體取代為其 CoreGraphics
對應專案,如下表所示:
System.Drawing 中的舊類型 | 新的數據類型 CoreGraphics | 描述 |
---|---|---|
RectangleF |
CGRect |
保存浮點矩形資訊。 |
SizeF |
CGSize |
儲存浮點大小資訊(寬度、高度) |
PointF |
CGPoint |
儲存浮點、點資訊 (X、Y) |
舊資料類型會使用浮點數來儲存資料結構的元素,而新的資料類型則使用 System.nfloat
。