Mac 和 iOS API 會使用 32 位平臺上一律為 32 位的架構特定數據類型,以及 64 位平臺上的 64 位。
例如, Objective-C 將 NSInteger 數據類型對應至 int32_t 32位系統上和 int64_t 64位系統上。
為了符合此行為,我們會在整合 API 上,將先前的用法int取代為新的數據類型:System.Int32System.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和 nfloatnuint 到int的明確轉換,uint而且float因為原生類型可能會保存 64 位的記憶體。
您必須使用、 longulong 和 double 到 nint的明確轉換,nfloatnuint因為原生類型可能只能保存 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。