Adakah yang bisa memberikan penjelasan yang baik (semoga dengan contoh) dari 3 delegasi paling penting ini:
- Predikat
- Tindakan
- Func
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.
System.Converter<TInput, TOutput>
, meski jarang dipakai.EventHandler/EventHandler<T>
muncul di seluruh bagian luar WinForms juga.Action
,Func
danPredicate
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 pembungkusFunc<T,bool>
.sumber
Selain jawaban Jon, ada juga
Converter<TInput, TOutput>
: Ini pada dasarnyaFunc<TInput, TOutput>
, tetapi dengan semantik. Digunakan oleh List.ConvertAll dan Array.ConvertAll, tetapi secara pribadi belum melihatnya di tempat lain.sumber
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.
sumber
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.
sumber
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();
sumber
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
sumber
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
sumber