Bab Backing Fields menunjukkan harga yang harus dibayar ketika aksesor butuh logika: kita harus mendeklarasikan field manual lalu menyalin nilai bolak-balik. C# 13 memperkenalkan jalan tengah bernama field-backed properties. Kata kunci kontekstual field di dalam aksesor merujuk ke backing field yang disiapkan compiler, sehingga logika kecil dapat dipasang tanpa deklarasi field sama sekali.

Masalah: Logika Kecil yang Menuntut Field Manual #

Property Nama pada class Profil perlu memangkas spasi di awal dan akhir setiap nilai yang masuk. Auto-property tidak bisa memuat logika itu karena aksesor set-nya kosong. Solusi manual menuntut deklarasi private string nama; plus dua aksesor, dan pola itu berulang di setiap property serupa. Kita butuh cara mengakses penyimpanan bawaan property langsung dari dalam aksesor.

Mekanisme Kata Kunci field #

Kata kunci field bekerja sebagai berikut:

  • Di dalam aksesor property yang menulis field, compiler menyediakan backing field secara otomatis dan field merujuk ke penyimpanan tersebut.
  • Property tanpa field maupun aksesor berbadan penuh tetap menjadi auto-property biasa, sehingga perilaku property lama tidak berubah.
  • Fitur ini masih berstatus preview pada C# 13: project harus memakai <LangVersion>preview</LangVersion> di dalam file .csproj.

Bila LangVersion tidak diatur ke preview, compiler memperlakukan field sebagai identifier biasa dan melaporkan galat CS0103.

xml
<PropertyGroup>
  <LangVersion>preview</LangVersion>
</PropertyGroup>

Contoh: Nama yang Otomatis Dipangkas #

csharp
public class Profil
{
    public string Nama
    {
        get => field ?? "Tanpa Nama";
        set => field = value.Trim();
    }
}

Profil profil = new Profil();
Console.WriteLine($"[{profil.Nama}]");

profil.Nama = "  Andi  ";
Console.WriteLine($"[{profil.Nama}]");

Output yang Dihasilkan:

text
[Tanpa Nama]
[Andi]

Mari kita bedah baris demi baris:

  1. get => field ?? "Tanpa Nama";: aksesor get membaca backing field milik compiler; bila field masih null, operator ?? menghasilkan teks "Tanpa Nama" sebagai nilai bawaan.
  2. set => field = value.Trim();: aksesor set memangkas spasi dari value sebelum menyimpannya ke backing field, dan tidak ada field manual yang dideklarasikan.
  3. Console.WriteLine($"[{profil.Nama}]"); sebelum penugasan: pembacaan pertama menampilkan Tanpa Nama karena backing field belum pernah diisi.
  4. profil.Nama = " Andi ";: penugasan menyimpan "Andi" tanpa spasi, dan pembacaan berikutnya menampilkan hasil pangkasan tersebut di antara tanda kurung siku.
text
error CS0103: The name 'field' does not exist in the current context