Antworten:
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.
EventHandler/EventHandler<T>
erscheinen auch außerhalb von WinForms.
Action
, Func
Und Predicate
alle 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>
.
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.
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.
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();
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
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
System.Converter<TInput, TOutput>
, obwohl es selten verwendet wird.