Bagikan melalui


Delegasi yang Diketik dengan kuat

Sebelumnya

Di artikel sebelumnya, Anda melihat bahwa Anda membuat jenis delegasi tertentu menggunakan delegate kata kunci.

Kelas Delegasi abstrak menyediakan infrastruktur untuk konektor dan pemanggilan yang longgar. Jenis Delegasi Konkret menjadi jauh lebih berguna dengan merangkul dan menegakkan keamanan jenis untuk metode yang ditambahkan ke daftar pemanggilan untuk objek delegasi. Saat Anda menggunakan delegate kata kunci dan menentukan jenis delegasi konkret, pengkompilasi menghasilkan metode tersebut.

Dalam praktiknya, ini akan menyebabkan pembuatan jenis delegasi baru setiap kali Anda memerlukan tanda tangan metode yang berbeda. Pekerjaan ini bisa melelahkan setelah beberapa waktu. Setiap fitur baru memerlukan jenis delegasi baru.

Namun, hal ini tidak perlu. Kerangka kerja .NET Core berisi beberapa jenis yang dapat Anda gunakan kembali kapan pun Anda memerlukan jenis delegasi. Ini adalah definisi umum sehingga Anda dapat mendeklarasikan penyesuaian saat Anda memerlukan deklarasi metode baru.

Yang pertama dari jenis ini adalah Action jenisnya, dan beberapa variasi:

public delegate void Action();
public delegate void Action<in T>(T arg);
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
// Other variations removed for brevity.

Pengubah in pada argumen jenis generik dibahas dalam artikel tentang kovarian.

Ada variasi delegasi Action yang berisi hingga 16 argumen seperti Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>. Penting bahwa definisi ini menggunakan argumen generik yang berbeda untuk setiap argumen delegasi: Yang memberi Anda fleksibilitas maksimum. Argumen metode tidak perlu, tetapi mungkin, jenis yang sama.

Gunakan salah satu jenis Action untuk jenis delegasi apa pun yang memiliki jenis pengembalian yang batal.

Kerangka kerja ini juga menyertakan beberapa jenis delegasi generik yang dapat Anda gunakan untuk jenis delegasi yang mengembalikan nilai:

public delegate TResult Func<out TResult>();
public delegate TResult Func<in T1, out TResult>(T1 arg);
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
// Other variations removed for brevity

Pengubah out pada argumen jenis generik dibahas dalam artikel tentang kovarian.

Ada variasi delegasi Func dengan hingga 16 argumen input seperti Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>. Jenis hasil selalu merupakan parameter jenis terakhir dalam semua Func deklarasi, menurut konvensi.

Gunakan salah satu jenis Func untuk jenis delegasi apa pun yang mengembalikan nilai.

Ada juga jenis khusus Predicate<T> untuk delegasi yang mengembalikan pengujian pada satu nilai:

public delegate bool Predicate<in T>(T obj);

Anda mungkin melihat bahwa untuk jenis apa pun Predicate, jenis yang setara Func secara struktural ada Misalnya:

Func<string, bool> TestForString;
Predicate<string> AnotherTestForString;

Anda mungkin berpikir kedua jenis ini setara. Tidak. Kedua variabel ini tidak dapat digunakan secara bergantian. Variabel dari satu jenis tidak dapat ditetapkan jenis lainnya. Sistem jenis C# menggunakan nama jenis yang ditentukan, bukan struktur.

Semua definisi jenis delegasi ini di Pustaka .NET Core harus berarti bahwa Anda tidak perlu menentukan jenis delegasi baru untuk fitur baru yang Anda buat yang memerlukan delegasi. Definisi umum ini harus menyediakan semua jenis delegasi yang Anda butuhkan dalam sebagian besar situasi. Anda cukup membuat instans salah satu jenis ini dengan parameter jenis yang diperlukan. Dalam kasus algoritma yang dapat dibuat generik, delegasi ini dapat digunakan sebagai jenis generik.

Ini akan menghemat waktu, dan meminimalkan jumlah jenis baru yang perlu Anda buat untuk bekerja dengan delegasi.

Di artikel berikutnya, Anda akan melihat beberapa pola umum untuk bekerja dengan delegasi dalam praktiknya.

Berikutnya