Tipe int dan long ukurannya tetap di semua mesin, sementara banyak API tingkat rendah bekerja dengan bilangan yang ukurannya mengikuti platform: 4 byte pada prosesor 32-bit dan 8 byte pada 64-bit. Sejak C# 9, kata kunci nint dan nuint menyediakan tipe semacam itu; keduanya alias untuk IntPtr dan UIntPtr yang selama ini dipakai kode interop. Bab ini membedah ukurannya, aritmetikanya, dan batasan konversinya.

Ukuran Mengikuti Platform #

Properti nint.Size melaporkan lebar tipe dalam byte pada mesin tempat program berjalan. Nilai ekstrem seperti nuint.MaxValue juga ikut berubah menurut platform, sehingga kode yang menyimpan angka ekstrem perlu menyadari perbedaan ini. Semua output pada bab ini berasal dari mesin 64-bit, di mana nint.Size bernilai 8.

Contoh: Aritmetika dan Konversi #

csharp
nint alamat = 128;
nint geser = alamat + 8;
Console.WriteLine(geser);

nuint jarak = 16;
nuint duaKali = jarak * 2;
Console.WriteLine(duaKali);

Console.WriteLine(nint.Size);
Console.WriteLine(nuint.MaxValue);

nint dariIntPtr = (nint)new IntPtr(99);
IntPtr kembali = (IntPtr)dariIntPtr;
Console.WriteLine($"{dariIntPtr} {kembali}");

Output yang Dihasilkan:

text
136
32
8
18446744073709551615
99 99

Mari kita bedah baris demi baris:

  1. alamat + 8: nint mendukung operator aritmetika seperti tipe bilangan lain, sehingga offset 128 dinaikkan menjadi 136.
  2. jarak * 2: nuint hanya menampung nilai tak bertanda; hasil perkaliannya 32.
  3. nint.Size dan nuint.MaxValue: di mesin 64-bit keduanya melaporkan 8 dan 18446744073709551615; pada mesin 32-bit nilai tersebut menjadi 4 dan 4294967295.
  4. (nint)new IntPtr(99): konversi ke dan dari IntPtr berlangsung eksplisit dan tanpa biaya, karena nint hanyalah nama lain tipenya.

Kapan Memakai nint #

  • Menyusun kode interop dengan pustaka native yang tanda tangannya memakai IntPtr.
  • Menghitung offset atau selisih alamat memori pada kode performa tinggi.
  • Untuk kebutuhan lain, tetap gunakan int atau long, karena ukurannya pasti dan hasilnya konsisten di semua platform.