C# 12 membawa dua fitur dengan status khusus. Attribute [Experimental] memberi tanda resmi bahwa sebuah API belum stabil, dan interceptors memberi kesempatan kepada source generator untuk menulis ulang pemanggilan method tertentu. Keduanya sering muncul di pustaka modern, meski interceptors masih berstatus preview. Bab ini memperkenalkan keduanya pada level pengantar.
Attribute Experimental #
Attribute [Experimental("ID")] ditempelkan pada tipe atau anggota yang belum stabil. Begitu kode luar memakainya, compiler melaporkan diagnostic dengan ID tersebut; tingkat keparahannya default error, sehingga pemakaian harus disengaja. Penekanan dilakukan lewat #pragma warning disable di sekitar pemanggilan, atau properti <NoWarn> di project. Pustaka memakai tanda ini untuk memberi ruang umpan balik sebelum API dikunci.
[Experimental("TUTOR001")]
static class MesinEksperimen
{
public static int Kuadrat(int nilai)
{
return nilai * nilai;
}
}
#pragma warning disable TUTOR001
Console.WriteLine(MesinEksperimen.Kuadrat(7));
#pragma warning restore TUTOR001Output yang Dihasilkan:
49Mari kita bedah baris demi baris:
[Experimental("TUTOR001")]: attribute dari namespaceSystem.Diagnostics.CodeAnalysismenandai seluruh class sebagai area eksperimen.#pragma warning disable TUTOR001: pemanggilan di antara pragma danrestoredisetujui secara sadar oleh penulisnya, sehingga program tetap terkompilasi.MesinEksperimen.Kuadrat(7): tanpa pragma, compiler menolak denganerror TUTOR001: 'MesinEksperimen' is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.
Interceptors: Penulisan Ulang Panggilan #
Interceptors bekerja sebaliknya: penulis pustaka, bukan pemanggil, yang menandai penggantian. Berikut bentuk idenya:
[InterceptsLocation("Program.cs", line: 12, column: 9)]
public static int KuadratTerintersepsi(int nilai)
{
return nilai * nilai;
}Attribute [InterceptsLocation] menunjuk posisi persis satu pemanggilan, ditandai nama file, baris, dan kolom. Saat kompilasi, compiler mengganti panggilan di posisi itu dengan method penanda, selama signature dan tipe pemanggilannya cocok; hanya pemanggilan method non-virtual yang dapat digantikan. Dukungan resminya diberikan kepada source generator, misalnya untuk mengganti rantai LINQ dengan versi teroptimasi.