Heim > Artikel > Backend-Entwicklung > C#-Lerntagebuch 25 --- Anonyme Methoden, Func-Delegaten und Lambda-Ausdrücke
In C#-Versionen vor 2.0 bestand die einzige Möglichkeit, einen Delegaten zu deklarieren, darin, eine benannte Methode zu verwenden. Mit C# 2.0 wurden anonyme Methoden (delegate) eingeführt, und in C# 3.0 und höher ersetzten Lambda-Ausdrücke anonyme Methoden als bevorzugte Methode zum Schreiben von Inline-Code.
Anonymer Delegat (Methode):
Der Name des anonymen Delegaten ist nicht korrekt. Er sollte genauer als anonyme Methode bezeichnet werden (kurz gesagt, die beiden bedeuten dasselbe Ding). Ich habe bereits in Delegate Type erwähnt, dass ein Delegate verwendet wird, um auf eine Methode zu verweisen, die dieselbe Bezeichnung wie diese hat. Mit anderen Worten: Sie können ein Delegatobjekt verwenden, um eine Methode aufzurufen, auf die der Delegat verweisen kann (der Parameter ist der Methodenname). Anonyme Methoden hingegen verwenden einen Codeblock als Delegatenparameter (der Parameter ist der Code, der die Funktion implementiert). Durch die Verwendung anonymer Methoden reduzieren Sie den Codierungsaufwand, der zum Instanziieren des Delegaten erforderlich ist, da dieser nicht vorhanden ist um eine separate Methode zu erstellen.
Anonyme Methode bearbeiten:
Ist die anonyme Methode direkt im Codeblock innerhalb des Delegaten eingebunden, oder sie muss mit dem Schlüsselwort „delegate“ deklariert werden, um einen Delegaten zu erstellen Beispiel.
delegate void MyDelegate(int i); //Deklarieren Sie einen Delegaten
MyDelegate my = delegate(int i){/* Codeblock*/}; //Durch Erstellen einer Delegate-Instanz Implementieren eine anonyme Methode
Anonyme Methodeninstanz:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { //声明一个委托 delegate void MyDelegate(string str); //定义一个实名方法 public static void fun(string str) { Console.WriteLine("这是一个 {0} 方法", str); } static void Main(string[] args) { //创建一个委托实例,里面包含一个匿名方法 MyDelegate examp1 = delegate(string name) { Console.WriteLine("这是一个 {0} 方法",name); //代码块 }; examp1("匿名"); //调用匿名方法 MyDelegate examp2 = new MyDelegate(fun); //在委托中实名注册一个fun命名方法 examp2("实名"); //调用命名方法 } } }
Ergebnis:
Parameter der anonymen Methode Der Geltungsbereich ist der „anonyme Methodenblock“.
Es ist ein Fehler, Sprunganweisungen (wie goto, break oder continue) innerhalb eines anonymen Methodenblocks zu verwenden, wenn das Ziel außerhalb des Blocks liegt. Es ist auch ein Fehler, Sprunganweisungen (wie goto, break oder continue) außerhalb eines anonymen Methodenblocks zu verwenden, wenn sich das Ziel innerhalb des Blocks befindet.
Func
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明委托 public static string Toup(string str) //定义方法 { return str.ToUpper(); } static void Main(string[] args) { string str = "abc"; MyDelegate my = Toup; //注册方法 Console.WriteLine(my(str));//调用方法 结果 ABC } } }Im Vergleich dazu sind die Ergebnisse der beiden gleich, aber Func ist viel einfacher als Delegate, aber Delegate kann anonyme Methoden laden. Im obigen Beispiel verwenden wir beispielsweise anonyme Methoden :
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { public static string Toup(string str) //定义方法 { return str.ToUpper(); } static void Main(string[] args) { string str = "abc"; Func<string, string> change = Toup; //泛型委托 Console.WriteLine(change(str));//调用方法 结果 ABC } } }Func Ist das auch okay? Func kann auch anonyme Methoden erstellen, und es ist nicht erforderlich, sie wie folgt zu deklarieren:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { delegate string MyDelegate(string s);//声明委托 static void Main(string[] args) { string str = "abc"; //创建匿名方法 MyDelegate my = delegate(string s) { return s.ToUpper(); }; Console.WriteLine(my(str)); //结果 ABC } } }Im Vergleich zu den oben genannten anonymen Methoden stellen wir fest, dass beim Erstellen anonymer Methoden beide über Delegaten (Delegate) implementiert werden Wird immer noch verwendet), können wir den Delegaten nicht verwenden? Zu diesem Zeitpunkt müssen wir den Lambda-Ausdruck lernen:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { static void Main(string[] args) { string str = "abc"; //创建匿名方法 Func<string, string> change = delegate(string s) { return s.ToUpper(); }; Console.WriteLine(change(str)); //结果 ABC } } }
Lambda-Ausdruck ist eine anonyme Methode, die zum Erstellen eines Delegaten- oder Ausdrucksbaumtyps verwendet werden kann. Mithilfe von Lambda-Ausdrücken können Sie lokale Funktionen schreiben, die als Argumente übergeben oder als Wert eines Funktionsaufrufs zurückgegeben werden können. Um einen Lambda-Ausdruck zu erstellen, geben Sie die Eingabeparameter (falls vorhanden) auf der linken Seite des Lambda-Operators => an und geben dann auf der anderen Seite einen Ausdruck oder einen Anweisungsblock ein. Beispielsweise gibt der Lambda-Ausdruck x => x * x ein Argument mit dem Namen x an und gibt das Quadrat von x zurück.
Im obigen Beispiel verwenden wir also den Lambda-Ausdruck, um eine anonyme Methode zu erstellen und ändern sie in: Im Delegate-Delegate-Typ Wir können auch Lambda-Ausdrücke verwenden, um anonyme Methoden zu erstellen:
Das Obige ist der Inhalt von C#-Lerntagebuch 25 ---Anonyme Methoden, Func-Delegaten und Lambda-Ausdrücke beachten Sie bitte zur chinesischen PHP-Website (www.php.cn)!
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test1 { class Program { static void Main(string[] args) { string str = "abc"; //lambda 表达式 Func<string, string> change = s => s.ToUpper(); //传入string 类型s 返回s.ToUpper(); Console.WriteLine(change(str)); //结果 ABC } } }