Delegierte: Prädikat vs. Aktion vs. Funktion

137

Kann jemand eine gute Erklärung (hoffentlich mit Beispielen) für diese 3 wichtigsten Delegierten geben:

  • Prädikat
  • Aktion
  • Func
Andrew
quelle

Antworten:

180
  • Predicate: im Wesentlichen Func<T, bool>; stellt die Frage "Erfüllt das angegebene Argument die vom Delegierten dargestellte Bedingung?" Wird in Dingen wie List.FindAll verwendet.

  • Action: Führen Sie eine Aktion mit den angegebenen Argumenten aus. Sehr allgemeiner Zweck. Wird in LINQ nicht viel verwendet, da es im Grunde genommen Nebenwirkungen impliziert.

  • Func: Gebrauchte ausgiebig in der Regel in LINQ, das Argument, zum Beispiel durch Projektion eine komplexe Struktur auf eine Eigenschaft zu verwandeln.

Andere wichtige Delegierte:

  • EventHandler/ EventHandler<T>: Wird in allen WinForms verwendet

  • Comparison<T>: Wie IComparer<T>aber in Delegiertenform.

Jon Skeet
quelle
3
Es gibt auch System.Converter<TInput, TOutput>, obwohl es selten verwendet wird.
G-Wiz
4
Der Konverter ist ein netter Delegierter, wenn viel Modell in Geschäftsklassen konvertiert werden muss
Michael Stum
EventHandler/EventHandler<T>erscheinen auch außerhalb von WinForms.
Andy
@Andy: Etwas ... Aber weniger in WPF zum Beispiel. Ich bin damit einverstanden, dass es nichts WinForms-spezifisches gibt.
Jon Skeet
48

Action, FuncUnd Predicatealle gehören in den Delegat Familie.

Action : Die Aktion kann n Eingabeparameter annehmen, gibt jedoch void zurück.

Func: Func kann n Eingabeparameter annehmen, gibt jedoch immer das Ergebnis des angegebenen Typs zurück. Func<T1,T2,T3,TResult>, hier sind T1, T2, T3 Eingangsparameter und TResult ist der Ausgang davon.

Predicate: Prädikat ist auch eine Form von Func, gibt aber immer bool zurück. In einfachen Worten ist es Wrapper von Func<T,bool>.

Rahul Garg
quelle
BESTE und EINFACHSTE Antwort, die ich je in Bezug auf diese Frage gefunden habe
Reyan Chougle
@ ReyanChougle: Schön, dass du es hilfreich findest.
Rahul Garg
9

Neben Jons Antwort gibt es auch

  • Converter<TInput, TOutput>: Es ist im Wesentlichen Func<TInput, TOutput>, aber mit Semantik. Wird von List.ConvertAll und Array.ConvertAll verwendet, hat es aber persönlich nirgendwo anders gesehen.
G-Wiz
quelle
4

MethodInvoker ist eine Methode, die WinForms-Entwickler verwenden können. Es akzeptiert keine Argumente und gibt keine Ergebnisse zurück. Es ist älter als Action und wird immer noch häufig beim Aufrufen des UI-Threads verwendet, da BeginInvoke () et al. Einen untypisierten Delegaten akzeptieren. obwohl Action genauso gut tun wird.

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

Ich würde auch ThreadStart und ParameterizedThreadStart kennen; Wieder werden die meisten Leute heutzutage eine Aktion ersetzen.

El Zorko
quelle
3

Prädikat, Funktion und Aktion sind integrierte Delegateninstanzen von .NET. Jede dieser Delegateninstanzen kann auf Benutzermethoden mit einer bestimmten Signatur verweisen oder auf diese verweisen.

Aktionsdelegierter - Instanzen von Aktionsdelegierten können auf Methoden verweisen, die Argumente annehmen und void zurückgeben.

Func-Delegat - Die Func-Delegatinstanz kann auf Methoden verweisen, die eine variable Anzahl von Argumenten annehmen und einen Typ zurückgeben.

Prädikat - Prädikate ähneln func-Delegatinstanzen und können auf Methoden verweisen, die eine variable Anzahl von Argumenten verwenden und einen Bool-Typ zurückgeben.

IntelligentBinary
quelle
2

Action und Func mit 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();
Stich
quelle
2

Func ist LINQ-freundlicher und kann als Parameter übergeben werden. (punktfrei)

Prädikat kann nicht, muss erneut umbrochen werden.

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
quelle
2

Ein einfaches Beispiel über die Argumente und was jeden Typ retutn

Diese Funktion verwendet zwei int-Argumente und gibt ein int zurück. Func hat immer den Rückgabetyp

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

In diesem Fall hat func keine Argumente, sondern gibt eine Zeichenfolge zurück

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

Diese Aktion verwendet zwei int-Argumente und gibt void zurück

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

Dieses Prädikat nimmt ein Argument und gibt immer bool zurück. Im Allgemeinen geben Prädikate immer bool zurück.

Predicate<int> isPositive = (x) => x > 0;
Console.WriteLine(isPositive(5));//Print True
dimath
quelle