Bagikan melalui


Delegasi Berjenis Kuat

Sebelumnya

Pada artikel sebelumnya, Anda melihat bahwa Anda membuat tipe delegasi tertentu menggunakan delegate keyword.

Kelas Abstract Delegate menyediakan dasar penghubungan longgar dan pemanggilan. Tipe Delegasi Konkret menjadi jauh lebih berguna dengan merangkul dan menegakkan keamanan tipe untuk metode yang ditambahkan ke daftar panggilan pada 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.

Untungnya, ini tidak diperlukan. Kerangka kerja .NET Core berisi beberapa jenis yang dapat Anda gunakan kembali setiap kali Anda memerlukan jenis delegasi. Ini adalah definisi generik sehingga Anda dapat mendeklarasikan kustomisasi saat Anda memerlukan deklarasi metode baru.

Yang pertama dari jenis-jenis ini adalah jenis Action, serta 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 kovarians.

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: Itu memberi Anda fleksibilitas maksimum. Argumen metode mungkin berjenis yang sama, tetapi tidak harus demikian.

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 hasil dibahas dalam artikel tentang kovarians.

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 hasilnya 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. Mereka 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 generik ini harus menyediakan semua jenis delegasi yang Anda butuhkan di sebagian besar situasi. Anda cukup menginstansiasi salah satu tipe ini dengan parameter tipe yang dibutuhkan. Dalam kasus algoritma yang dapat dibuat generik, delegasi ini dapat digunakan sebagai jenis generik.

Ini harus 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