Собственные типы для iOS и macOS
API Mac и iOS используют типы данных, относящиеся к архитектуре, которые всегда являются 32-разрядными на 32-разрядных платформах и 64-разрядных платформах.
Например, Objective-C сопоставляет NSInteger
тип int32_t
данных с 32-разрядными системами и int64_t
64-разрядными системами.
Чтобы соответствовать этому поведению, в нашем унифицированном API мы заменяем предыдущие варианты использования int
(которые в .NET определяются как всегдаSystem.Int32
) новым типом данных: System.nint
Вы можете считать "n" значением "native", поэтому собственный целочисленный тип платформы.
С этими новыми типами данных один и тот же исходный код компилируется для 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 целочисленного и плавающего запятого.
Операторы неявных преобразований предоставляются, если нет возможности потери данных (32-разрядные значения хранятся в 64-разрядном пространстве).
Операторы явного преобразования предоставляются, если существует вероятность потери данных (64-разрядное значение хранится в 32 или потенциально 32 расположении хранилища).
int
, uint
и float
все неявно nint
преобразованы в, nuint
и nfloat
как 32 бит всегда будут соответствовать 32 или 64 битам.
nint
, nuint
и nfloat
все неявно преобразуются long
в , ulong
и double
как 32 или 64-разрядные значения всегда будут соответствовать 64-разрядному хранилищу.
Необходимо использовать явные преобразования из , nuint
а int
nfloat
также nint
в , uint
float
так как собственные типы могут содержать 64 бит хранилища.
Необходимо использовать явные преобразования из long
, ulong
а double
nint
также в, nuint
nfloat
так как собственные типы могут хранить только 32 бита хранилища.
Типы CoreGraphics
Типы данных точки, размера и прямоугольника, используемые в CoreGraphics, используют 32 или 64 бита в зависимости от устройства, на котором они работают. При первоначальной привязке API iOS и Mac мы использовали существующие структуры данных, которые соответствовали размерам платформы узла (типы данных в System.Drawing
).
При переходе в Unified необходимо заменить экземпляры System.Drawing
их CoreGraphics
коллегами, как показано в следующей таблице:
Старый тип в System.Drawing | Новый тип данных CoreGraphics | Description |
---|---|---|
RectangleF |
CGRect |
Содержит данные прямоугольника с плавающей запятой. |
SizeF |
CGSize |
Содержит сведения о размере с плавающей запятой (ширина, высота) |
PointF |
CGPoint |
Содержит плавающую точку, сведения о точке (X, Y) |
Старые типы данных используются с плавающей запятой для хранения элементов структур данных, а новый используется System.nfloat
.