Delegasi: Predikat vs. Tindakan vs. Fungsi

138

Adakah yang bisa memberikan penjelasan yang baik (semoga dengan contoh) dari 3 delegasi paling penting ini:

  • Predikat
  • Tindakan
  • Func
Andrew
sumber

Jawaban:

181
  • 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.

Jon Skeet
sumber
3
Ada juga System.Converter<TInput, TOutput>, meski jarang dipakai.
G-Wiz
4
Konverter adalah delegasi yang baik ketika dibutuhkan banyak Konversi Model ke kelas Bisnis, yaitu stum.de/2009/12/23/…
Michael Stum
EventHandler/EventHandler<T>muncul di seluruh bagian luar WinForms juga.
Andy
@Andy: Agak ... Tapi kurang begitu di WPF misalnya. Saya setuju bahwa tidak ada yang khusus untuk WinForms.
Jon Skeet
51

Action, Funcdan Predicatesemuanya 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>.

Rahul Garg
sumber
Jawaban TERBAIK dan SEDERHANA yang pernah saya temukan sehubungan dengan pertanyaan ini
Reyan Chougle
9

Selain jawaban Jon, ada juga

  • Converter<TInput, TOutput>: Ini pada dasarnya Func<TInput, TOutput>, tetapi dengan semantik. Digunakan oleh List.ConvertAll dan Array.ConvertAll, tetapi secara pribadi belum melihatnya di tempat lain.
G-Wiz
sumber
4

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.

El Zorko
sumber
3

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.

IntelligentBinary
sumber
2

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();
Pang
sumber
2

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
Rm558
sumber
2

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
dimath
sumber