Delegeler: Tahmin ve Eylem - Func


137

Birisi bu en önemli 3 delege hakkında iyi bir açıklama yapabilir (umarım örneklerle):

  • yüklem
  • Aksiyon
  • Func

Yanıtlar:


180
  • Predicate: esasen Func<T, bool>; "belirtilen argüman temsilci tarafından temsil edilen koşulu karşılıyor mu?" sorusunu soruyor. List.FindAll gibi şeylerde kullanılır.

  • Action: Bağımsız değişkenler verildiğinde bir eylem gerçekleştirin. Çok genel bir amaç. Temel olarak, yan etkiler anlamına geldiği için LINQ'da fazla kullanılmaz.

  • Func: Genellikle argümanı dönüştürmek için, örneğin karmaşık bir yapıyı bir özelliğe yansıtarak, LINQ'da yaygın olarak kullanılır .

Diğer önemli delegeler:

  • EventHandler/ EventHandler<T>: WinForms'un her yerinde kullanılır

  • Comparison<T>: IComparer<T>Delege formunda olduğu gibi.


3
Orada da System.Converter<TInput, TOutput>nadiren kullanılan rağmen.
G-Wiz

4
Bir çok Modelin İşletme sınıflarına dönüştürülmesi gerektiğinde Dönüştürücü güzel bir delege, yani stum.de/2009/12/23/…
Michael Stum

EventHandler/EventHandler<T>WinForms'un her yerinde de görünür.
Andy

@Andy: Biraz ... Örneğin WPF'de daha az. WinForms'a özgü bir şey olmadığını kabul ediyorum.
Jon Skeet

48

Action, FuncvePredicate tüm temsilci ailesine aittir.

Action : Eylem n girdi parametresi alabilir, ancak geçersiz döndürür.

Func : Func n giriş parametresini alabilir, ancak her zaman sağlanan türün sonucunu döndürür. Func<T1,T2,T3,TResult>, burada T1, T2, T3 giriş parametreleridir ve TResult bunun çıktısıdır.

Predicate: Tahmin aynı zamanda bir Func şeklidir, ancak her zaman boole geri döner. Basit bir deyişle, sarıcıdır Func<T,bool>.


Bu soru ile ilgili bulduğum en iyi ve en basit cevap
Reyan Chougle

@ReyanChougle: Sevindim, yararlı buluyorsun.
Rahul Garg

9

Jon'un cevabına ek olarak,

  • Converter<TInput, TOutput>: Aslında Func<TInput, TOutput>, ama anlambilimle. List.ConvertAll ve Array.ConvertAll tarafından kullanılır, ancak kişisel olarak başka hiçbir yerde görmedim.

4

MethodInvoker, WinForms geliştiricilerinin kullanabileceği bir yöntemdir; hiçbir argümanı kabul etmez ve sonuç döndürmez. Eylemden önce gelir ve hala BeginInvoke () ve türünün türetilmemiş bir Temsilci kabul ettiği için UI iş parçacığını çağırırken kullanılır; Action da aynı şeyi yapacaktır.

myForm.BeginInvoke((MethodInvoker)delegate
{
  MessageBox.Show("Hello, world...");
});

Ayrıca ThreadStart ve ParameterizedThreadStart; yine çoğu insan bugünlerde bir Eylem yerine geçecek.


3

Predicate, Func ve Action, .NET'in dahili delege örnekleridir. Bu delege örneklerinin her biri, özel imzalı kullanıcı yöntemlerine başvurabilir veya yönlendirebilir.

Eylem temsilcisi - Eylem temsilcisi örnekleri bağımsız değişkenleri alan ve geçersiz döndüren yöntemlere işaret edebilir.

Func delege - Func delege örneği, değişken sayıda bağımsız değişken alan ve bir tür döndüren yöntem (ler) i işaret edebilir.

Öngörme - Tahminler işlev temsilci örneklerine benzer ve değişken sayıda bağımsız değişken alan ve bir bool türü döndüren yöntemlere işaret edebilir.


2

Eylem ve lambda ile Func:

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();

2

Func daha LINQ dostudur, parametre olarak iletilebilir. (Nokta içermeyen)

Tahmin edemez, tekrar sarılmalıdır.

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

2

Bağımsız değişkenler ve her türün neyi geri döndürdüğü hakkında basit bir örnek

Bu Func iki int bağımsız değişkeni alır ve bir int döndürür.Func her zaman dönüş türüne sahiptir

 Func<int, int, int> sum = (a, b) => a + b;
 Console.WriteLine(sum(3, 5));//Print 8

Bu durumda func'un bağımsız değişkenleri yoktur ancak bir dize döndürür

Func<string> print = () => "Hello world";
Console.WriteLine(print());//Print Hello world

Bu Eylem iki int argümanı alır ve geçersiz dönüş

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

Bu Tahmin bir argüman alır ve her zaman boole döner.

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.