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 danfieldmerujuk ke penyimpanan tersebut. - Property tanpa
fieldmaupun 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.
<PropertyGroup>
<LangVersion>preview</LangVersion>
</PropertyGroup>Contoh: Nama yang Otomatis Dipangkas #
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:
[Tanpa Nama]
[Andi]Mari kita bedah baris demi baris:
get => field ?? "Tanpa Nama";: aksesorgetmembaca backing field milik compiler; bila field masihnull, operator??menghasilkan teks"Tanpa Nama"sebagai nilai bawaan.set => field = value.Trim();: aksesorsetmemangkas spasi darivaluesebelum menyimpannya ke backing field, dan tidak ada field manual yang dideklarasikan.Console.WriteLine($"[{profil.Nama}]");sebelum penugasan: pembacaan pertama menampilkanTanpa Namakarena backing field belum pernah diisi.profil.Nama = " Andi ";: penugasan menyimpan"Andi"tanpa spasi, dan pembacaan berikutnya menampilkan hasil pangkasan tersebut di antara tanda kurung siku.
error CS0103: The name 'field' does not exist in the current context