Типы nint и nuint (справочник по C#)

Начиная с C# 9.0, вы можете использовать ключевые слова nint и nuint для определения целых чисел собственного размера. Эти целые числа будут 32-разрядными при использовании в 32-битных процессах и 64-разрядными при использовании в 64-битных процессах. Их можно использовать для сценариев взаимодействия, с низкоуровневыми библиотеками и для оптимизации производительности в сценариях, где часто выполняются математические операции с целыми числами.

Целочисленные типы собственного размера представляются внутренне как типы .NET System.IntPtr и System.UIntPtr. В отличие от других числовых типов, эти ключевые слова — не просто псевдонимы для типов. Следующие инструкции не являются эквивалентными:

nint a = 1;
System.IntPtr a = 1;

Для nint и nuint компилятор предоставляет такие же преобразования и операции, как для всех целочисленных типов.

Собственный размер целого числа во время выполнения

Чтобы узнать размер целого числа собственного размера во время выполнения, используйте sizeof(). Но код должен компилироваться в контексте unsafe. Пример:

Console.WriteLine($"size of nint = {sizeof(nint)}");
Console.WriteLine($"size of nuint = {sizeof(nuint)}");

// output when run in a 64-bit process
//size of nint = 8
//size of nuint = 8

// output when run in a 32-bit process
//size of nint = 4
//size of nuint = 4

Такое же значение можно получить с помощью статических свойств IntPtr.Size и UIntPtr.Size.

MinValue и MaxValue

Чтобы получить минимальное и максимальное значения целых чисел собственного размера во время выполнения, используйте MinValue и MaxValue в качестве статических свойств с ключевыми словами nint и nuint, как показано в следующем примере:

Console.WriteLine($"nint.MinValue = {nint.MinValue}");
Console.WriteLine($"nint.MaxValue = {nint.MaxValue}");
Console.WriteLine($"nuint.MinValue = {nuint.MinValue}");
Console.WriteLine($"nuint.MaxValue = {nuint.MaxValue}");

// output when run in a 64-bit process
//nint.MinValue = -9223372036854775808
//nint.MaxValue = 9223372036854775807
//nuint.MinValue = 0
//nuint.MaxValue = 18446744073709551615

// output when run in a 32-bit process
//nint.MinValue = -2147483648
//nint.MaxValue = 2147483647
//nuint.MinValue = 0
//nuint.MaxValue = 4294967295

Константы

Значения констант можно использовать в таких диапазонах:

Преобразования

Компилятор предоставляет неявные и явные преобразования в другие числовые типы. Для получения дополнительной информации см. статью Встроенные числовые преобразования.

Литералы

Для целочисленных литералов собственного размера не поддерживается прямой синтаксис. Суффикса, указывающего на то, что литерал является целым числом собственного размера (например, L для обозначения long), нет. Вместо этого можно использовать явные или неявные приведения других целочисленных значений. Пример:

nint a = 42
nint a = (nint)42;

Неподдерживаемые элементы IntPtr и UIntPtr

Следующие элементы структур IntPtr и UIntPtr не поддерживаются для типов nint и nuint:

Спецификация языка C#

Дополнительные сведения см. в статье о спецификации языка C# и в статье Целые числа собственного размера в предложениях по функциям C# 9.0.

См. также раздел