Поделиться через


Собственные типы для 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 а intnfloat также nintв , uintfloat так как собственные типы могут содержать 64 бит хранилища.

Необходимо использовать явные преобразования из long, ulong а doublenintтакже в, nuintnfloat так как собственные типы могут хранить только 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.