Ich sehe Delegierte in zwei Formen:
A. Func<string, string> convertMethod = lambda
B. public delegate string convertMethod(string value);
Ich bin mir nicht sicher, was der Unterschied zwischen diesen beiden ist. Sind sie beide Delegierte? Ich glaube, der erste würde ein Lambda verwenden und der zweite müsste eine Methode haben, um die Arbeit tatsächlich auszuführen. Ich kann auch verwirrt sein.
Antworten:
Zunächst machen Ihre beiden Beispiele zwei völlig getrennte Dinge. Die erste deklariert eine generische Delegatenvariable und weist ihr einen Wert zu, die zweite definiert lediglich einen
delegate
Typ. Ihr Beispiel wäre vollständiger:public static class Program { // you can define your own delegate for a nice meaningful name, but the // generic delegates (Func, Action, Predicate) are all defined already public delegate string ConvertedMethod(string value); public static void Main() { // both work fine for taking methods, lambdas, etc. Func<string, string> convertedMethod = s => s + ", Hello!"; ConvertedMethod convertedMethod2 = s => s + ", Hello!"; } }
Aber mehr auf den Punkt, beide
Func<string,string>
unddelegate string convertMethod(string)
wären in der Lage, die gleichen Methodendefinitionen zu halten, egal ob es sich um Methoden, anonyme Methoden oder Lambda-Ausdrücke handelt.Was Sie verwenden sollten, hängt von der Situation ab. Wenn Sie möchten, dass Ihr Delegat mehr durch das definiert wird, was er benötigt und zurückgibt, sind die generischen Delegaten perfekt. Wenn Sie die Delegierten wollen einige spezielle Namen zu haben , die mehr Definition dessen , was tun , dass Delegierte gibt sollte (über einfache
Action
,Predicate
etc) , dann Ihre eigenen Delegierten schaffen , ist immer eine Option.quelle
Func<int, string>
, das zeigt, dass die Form istFunc<arg1, result>
.Das Codebeispiel, das Sie haben, ist etwas verwirrend. Lassen Sie mich versuchen, es zu klären. Die folgenden 2 Elemente sind Delegiertenerklärungen. Diese sind leicht zu erkennen, da sie immer das
delegate
Schlüsselwort enthaltenpublic delegate TReturn Func<TArg, TReturn>(Targ value); public delegate string convertMethod(string value);
Diese Codezeile weist einem lokalen Wert einen Wert zu, der einem Delegaten eingegeben wird
Func<string, string> local = lambda;
Der obige Code ist jedoch nicht auf die Verwendung von nur Lambdas beschränkt. Der Wert kann auch eine kompatible Methodengruppe oder ein anderer Delegatenwert sein.
Ein weiterer Punkt zu beachten ist , dass obwohl
Func<string, string>
undconvertMethod
sind beiden Teilnehmer mit identischen Signaturen ihre Werte sind nicht miteinander konvertierbar. Zum Beispiel ist das Folgende illegalFunc<string, string> local1 = ...; convertMethod local2 = local1; // Error!!!
quelle
Von MSDN ,
und
Diese SO-Antwort auf das Schlüsselwort delegate vs lambda expression könnte Sie auch interessieren .
Darüber hinaus hat MSDN einen guten Artikel über Lambda Expressions :
delegate int del(int i); static void Main(string[] args) { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 }
quelle
A initialisiert eine Instanz eines Delegaten (die sofort aufgerufen werden kann). Es ist eine Variable vom Typ Func <string, string>.
B gibt die Definition eines Delegaten (seine Signatur) an. Es kann verwendet werden, um später Variablen vom Typ convertMethod zu definieren .
quelle