Adakah yang bisa memberikan penjelasan yang baik (semoga dengan contoh) dari 3 delegasi paling penting ini:
- Predikat
- Tindakan
- Func
Jawaban:
Predicate
: pada dasarnya Func<T, bool>
; menanyakan pertanyaan "apakah argumen yang ditentukan memenuhi kondisi yang diwakili oleh delegasi?" Digunakan dalam hal-hal seperti List.FindAll.
Action
: Melakukan tindakan dengan argumen. Tujuan yang sangat umum. Tidak banyak digunakan di LINQ karena menyiratkan efek samping, pada dasarnya.
Func
: Digunakan secara ekstensif di LINQ, biasanya untuk mengubah argumen, misalnya dengan memproyeksikan struktur kompleks ke satu properti.
Delegasi penting lainnya:
EventHandler
/ EventHandler<T>
: Digunakan di seluruh WinForms
Comparison<T>
: Suka IComparer<T>
tapi dalam bentuk delegasi.
EventHandler/EventHandler<T>
muncul di seluruh bagian luar WinForms juga.
Action
, Func
dan Predicate
semuanya milik keluarga delegasi.
Action
: Tindakan dapat mengambil n parameter masukan tetapi mengembalikan kosong.
Func
: Func dapat mengambil n parameter input tetapi akan selalu mengembalikan hasil dari tipe yang disediakan. Func<T1,T2,T3,TResult>
, di sini T1, T2, T3 adalah parameter masukan dan TResult adalah keluarannya.
Predicate
: Predikat juga merupakan bentuk Func tetapi akan selalu mengembalikan bool. Dengan kata sederhana itu adalah pembungkus Func<T,bool>
.
MethodInvoker adalah salah satu yang dapat digunakan oleh pengembang WinForms; ia tidak menerima argumen dan tidak mengembalikan hasil. Ini mendahului Action, dan masih sering digunakan saat memanggil ke UI thread karena BeginInvoke () dkk menerima Delegate tanpa tipe; meskipun Action juga akan berhasil.
myForm.BeginInvoke((MethodInvoker)delegate
{
MessageBox.Show("Hello, world...");
});
Saya juga akan mengetahui ThreadStart dan ParameterizedThreadStart; sekali lagi kebanyakan orang akan mengganti Action hari ini.
Predikat, Fungsi, dan Tindakan adalah contoh delegasi bawaan dari .NET. Masing-masing contoh delegasi ini dapat merujuk atau menunjuk ke metode pengguna dengan tanda tangan tertentu.
Delegasi tindakan - Contoh delegasi tindakan dapat menunjuk ke metode yang mengambil argumen dan mengembalikan void.
Delegasi fungsi - Contoh delegasi fungsi dapat menunjuk ke metode yang mengambil sejumlah variabel dari argumen dan mengembalikan beberapa tipe.
Predikat - Predikat mirip dengan contoh delegasi func dan mereka bisa menunjuk ke metode yang mengambil sejumlah variabel dari argumen dan mengembalikan tipe bool.
Aksi dan Func dengan lambda:
person p = new person();
Action<int, int> mydel = p.add; /*(int a, int b) => { Console.WriteLine(a + b); };*/
Func<string, string> mydel1 = p.conc; /*(string s) => { return "hello" + s; };*/
mydel(2, 3);
string s1= mydel1(" Akhil");
Console.WriteLine(s1);
Console.ReadLine();
Func lebih ramah LINQ, bisa diteruskan sebagai parameter. (tanpa poin)
Predikat tidak bisa, harus dibungkus lagi.
Predicate<int> IsPositivePred = i => i > 0;
Func<int,bool> IsPositiveFunc = i => i > 0;
new []{2,-4}.Where(i=>IsPositivePred(i)); //Wrap again
new []{2,-4}.Where(IsPositivePred); //Compile Error
new []{2,-4}.Where(IsPositiveFunc); //Func as Parameter
Contoh sederhana tentang argumen dan retutn apa setiap jenis
Func ini mengambil dua argumen int dan mengembalikan int. Func selalu memiliki tipe kembalian
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 5));//Print 8
Dalam hal ini func tidak memiliki argumen tetapi mengembalikan sebuah string
Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world
Tindakan ini mengambil dua argumen int dan mengembalikan void
Action<int, int> displayInput = (x, y) => Console.WriteLine("First number is :" + x + " , Second number is "+ y);
displayInput(4, 6); //Print First number is :4 , Second number is :6
Predikat ini mengambil satu argumen dan selalu mengembalikan bool. Umumnya Predikat selalu mengembalikan bool.
Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
System.Converter<TInput, TOutput>
, meski jarang dipakai.