Heim > Backend-Entwicklung > C#.Net-Tutorial > C#-Lerntagebuch 25 --- Anonyme Methoden, Func-Delegaten und Lambda-Ausdrücke

C#-Lerntagebuch 25 --- Anonyme Methoden, Func-Delegaten und Lambda-Ausdrücke

黄舟
Freigeben: 2017-01-21 15:31:49
Original
1826 Leute haben es durchsucht

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("实名");  //调用命名方法  
        }  
    }  
}
Nach dem Login kopieren

Ergebnis:

C#-Lerntagebuch 25 --- Anonyme Methoden, Func-Delegaten und Lambda-Ausdrücke

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 Methode mit dem Delegaten, wie zum Beispiel:

Wenn die Bedingungen es uns nicht erlauben, eine Delegate-Klasse im Programm zu deklarieren, wir aber einen Delegaten verwenden müssen, was sollen wir dann tun? An diesem Punkt können wir die Verwendung des Func-Delegaten in Betracht ziehen. FuncDer letzte Parameter in <> ist der Rückgabewerttyp. Ihre Funktionen ähneln den Delegaten, es ist jedoch keine Deklaration erforderlich Func-Delegat:
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  
              
        }  
    }  
}
Nach dem Login kopieren

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  
              
        }  
    }  
}
Nach dem Login kopieren

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  
              
        }  
    }  
}
Nach dem Login kopieren

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  
              
        }  
    }  
}
Nach dem Login kopieren

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  
              
        }  
    }  
}
Nach dem Login kopieren

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage