Bab Ref Locals dan Ref Returns menyebut aturan escape: compiler menilai seberapa jauh sebuah referensi boleh dibawa. Pada kode interop dan marshaling, penulis tipe kadang perlu menyatakan batas itu secara tegas alih-alih mengandalkan analisis biasa. C# 11 menyediakan modifier scoped untuk keperluan itu; bab ini memperkenalkannya pada level pengantar.

Makna Modifier scoped #

Modifier scoped dipasang pada parameter bertipe ref atau ref struct, serta pada field ref milik ref struct. Efeknya satu arah: rentang hidup referensi dipersempit, sehingga nilai itu tidak boleh lolos keluar dari pemanggilan method, misalnya lewat return ref atau penugasan ke field pemanggil. Fitur ini tidak mengubah perilaku runtime; yang dibatasi adalah keputusan compiler saat memeriksa kode.

Contoh: Parameter yang Tidak Boleh Lolos #

csharp
static int Jumlah(scoped ReadOnlySpan<int> angka)
{
    int total = 0;
    foreach (int n in angka)
    {
        total += n;
    }
    return total;
}

int[] nilai = { 5, 10, 15, 20 };
Console.WriteLine(Jumlah(nilai));
Console.WriteLine(Jumlah(nilai.AsSpan(1)));

Output yang Dihasilkan:

text
50
45

Mari kita bedah baris demi baris:

  1. scoped ReadOnlySpan<int> angka: signature menegaskan bahwa method hanya meminjam data untuk diproses dan tidak menyimpan referensi ke data tersebut.
  2. foreach (int n in angka): data dipakai sepenuhnya di dalam method; nilai kembalian berupa int hasil salinan, bukan referensi.
  3. Jumlah(nilai.AsSpan(1)): pemanggil boleh mengirim jendela array; jaminan scoped membuat pemanggil yakin data itu tidak tertinggal di dalam method.

Bila method mencoba menyelundupkan referensinya keluar, misalnya return ref angka[0] pada parameter scoped Span<int>, compiler menolak dengan galat CS8352: Cannot use variable 'scoped Span<int> angka' in this context because it may expose referenced variables outside of their declaration scope.

Di Mana scoped Ditemui #

Kita jarang menulis scoped sendiri pada kode aplikasi. Modifier ini sudah tercantum pada banyak signature di internal Span<T>, MemoryMarshal, dan API marshaling .NET modern, karena pustaka itulah yang paling membutuhkan kendali atas rentang hidup referensi. Ketika kita membangun ref struct sendiri seperti pada bab Ref Fields, pemahaman scoped menjadi bekal untuk menandai field yang tidak boleh menampung referensi jangka panjang.