Section Delegates dan Events menunjukkan bahwa delegate membungkus method ke dalam object, lengkap dengan alokasi heap dan pemanggilan tidak langsung melalui Invoke. Untuk interop native dan jalur kode yang sangat panas, biaya kecil itu menumpuk. C# 9 menyediakan function pointer: alamat fungsi mentah yang ditulis delegate* dan dipanggil tanpa membuat object. Fitur ini termasuk wilayah unsafe, dan section tersendiri membahas unsafe secara utuh; di bab ini kita memakai blok unsafe seminimal mungkin agar contoh tetap bisa dijalankan.
Sintaks delegate* #
Tipe delegate*<T1, T2, TResult> menyerupai Func<T1, T2, TResult>, tetapi tidak mewarisi Delegate. Operator & mengambil alamat method static, dan pemanggilannya berlangsung langsung pada alamat tersebut. Untuk interop dengan fungsi native, C# juga menyediakan calling convention unmanaged, misalnya delegate* unmanaged<int, int, int>.
Contoh: Delegate vs Function Pointer #
static int Tambah(int kiri, int kanan) => kiri + kanan;
static int Kali(int kiri, int kanan) => kiri * kanan;
Func<int, int, int> operasiDelegasi = Tambah;
Console.WriteLine(operasiDelegasi(3, 4));
unsafe
{
delegate*<int, int, int> operasi = &Tambah;
Console.WriteLine(operasi(3, 4));
operasi = &Kali;
Console.WriteLine(operasi(3, 4));
Console.WriteLine(sizeof(delegate*<int, int, int>));
}Output yang Dihasilkan:
7
7
12
8Mari kita bedah baris demi baris:
operasiDelegasi: bentuk delegate biasa; runtime membungkusTambahmenjadi object sebelum dipanggil.&Tambah: operator&mengambil alamat method static tanpa membungkusnya; tidak ada alokasi object pada baris ini.operasi(3, 4): pemanggilan langsung pada alamat; hasil7sama dengan delegate, tetapi tanpa lapisanInvoke.operasi = &Kali: variable function pointer cukup ditimpa alamatnya untuk berganti operasi, sehingga3 * 4menghasilkan12.sizeof(delegate*<int, int, int>): ukurannya8byte di mesin 64-bit, persis lebar satu alamat, bukan ukuran object lengkap.
Tipe parameter dan return pada delegate* harus cocok persis dengan method yang ditunjuk; compiler tidak menerima konversi seperti pada delegate.