Heim Backend-Entwicklung C#.Net-Tutorial Zusammenstellung von C#-Grundkenntnissen Grundkenntnisse (20) Delegation (1)

Zusammenstellung von C#-Grundkenntnissen Grundkenntnisse (20) Delegation (1)

Feb 11, 2017 pm 01:59 PM

Delegierte und Ereignisse werden in C# häufig verwendet, insbesondere bei der Formularprogrammierung. Viele Vorgänge müssen über Delegaten und Ereignisse verarbeitet und bereitgestellt werden. Hier finden Sie eine detaillierte Erläuterung der Verwendung und der Gründe von Delegaten und Ereignissen, damit wir sie beim Schreiben von Code besser verstehen können.
Die Verwendung von Delegation
Ereignisse sind ein Mechanismus, und Ereignisse werden durch Delegation implementiert. Wenn Sie also Delegation verstehen, werden Sie Ereignisse besser verstehen. Schauen wir uns unten ein kleines Beispiel an.
Dies ist der Code zur Beschreibung von Programmierern in verschiedenen Sprachen:
Zum Beispiel beschreiben wir einen Programmierer, der C# verwendet, wie folgt, wobei der Parameter „programerName“ den Namen des Programmierers darstellt.

        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }
Nach dem Login kopieren

Verwenden Sie Java,

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }
Nach dem Login kopieren

Wie können Sie bei so vielen Sprachen feststellen, um welchen Programmierer es sich handelt? Verwenden Sie eine Aufzählung zur Darstellung:

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }
Nach dem Login kopieren

Geben Sie dann eine vollständige Beschreibung ein. Der Code lautet wie folgt:

   public class ProgramerDescription
    {
        //01
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

        //02
        public void Description(string programerName, ProgramLanguage type)
        {
            switch (type)
            {
                case ProgramLanguage.CSharp:

                    CsharpProgramer(programerName);

                    break;

                case ProgramLanguage.C:

                    CProgramer(programerName);

                    break;

                case ProgramLanguage.Java:

                    JavaProgramer(programerName);

                    break;

                default:

                    Console.WriteLine("A kind of new Language that you never heard of.");

                    break;
            }
        }
    }

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }
Nach dem Login kopieren

Aufruf:

            ProgramerDescription pm = new ProgramerDescription();

            pm.Description("杨友山", ProgramLanguage.CSharp);
Nach dem Login kopieren

Zu diesem Zeitpunkt , Ausgabe „Yang Youshan verwendet C# zum Programmieren!“;
Auf diese Weise wurde zunächst eine einfache Implementierung der Beschreibung des Programmierers abgeschlossen. Die Beschreibungsmethode verwendet hier einen Aufzählungstyp, um verschiedene Sprachen zu unterscheiden. Daher ist die Wartbarkeit relativ schlecht, da es viele Programmiersprachen (C++, PHP usw.) gibt. Wenn Sie eine Sprache hinzufügen möchten, müssen Sie eine entsprechende Methode hinzufügen und diese dann ändern ProgramLanguage-Aufzählungstyp. Das Hinzufügen von Methoden hat kaum Auswirkungen auf das ursprüngliche Programm, da es mithilfe von Teilklassen implementiert werden kann. Eine Änderung der Aufzählung ist jedoch nicht im Einklang mit dem offenen und geschlossenen Prinzip des objektorientierten Designs.
Wie geht man damit in der Beschreibungsmethode um, also ohne Aufzählung? Wie unterscheidet die Beschreibungsmethode, welche Methode (CsharpProgramer, CProgramer, JavaProgramer) aufgerufen werden soll, um den Programmierer zu beschreiben?
public void Description(string programerName, ein bestimmter Parameter eines bestimmten Typs)
{
// Rufen Sie die entsprechende Methode auf
}
Der bestimmte Typ wird hier verwendet, um den Typ davon zu unterscheiden Mit anderen Worten, es ist am besten, wenn ich die Methode, die ich aufrufen möchte, hier direkt als Parameter übergebe. Zum Beispiel möchte ich die CProgramer-Methode aufrufen, um einen C-Programmierer zu beschreiben,
          ProgramerDescription pm = new ProgramerDescription(); So drücken Sie „einen bestimmten Typ und einen bestimmten Parameter“ von Description(string programerName, einen bestimmten Typ und a aus bestimmter Parameter)?

Natürlich denken wir an Delegate in C#. Ein Delegate ist eine Datenstruktur, die auf eine statische Methode oder auf eine Klasseninstanz und die Instanzmethoden dieser Klasse verweist. Verwenden Sie einen Delegaten, um den obigen Code zu vervollständigen:



Aufruf:

    public class ProgramDescriptionDelegate
    {
        //委托,表示方法
        public delegate void DescriptionDelegate(string programerName);

        //01
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
             Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
             Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

        //02
        public void Description(string programerName, DescriptionDelegate description)
        {
            description(programerName);
        }
    }
Nach dem Login kopieren

Das Ergebnis ist das gleiche wie der ursprüngliche Code.

Was ist Delegation? MSDN erklärt es so: Ein Delegat ist ein Typ, der eine Methodensignatur definiert, mit jeder Methode mit einer kompatiblen Signatur verknüpft werden kann und über den Delegaten aufgerufen werden kann. Delegaten werden verwendet, um Methoden als Parameter an andere Methoden zu übergeben. Zeithandler sind Methoden, die über Delegaten aufgerufen werden.
            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            pm.Description("杨友山", pm.CsharpProgramer);
Nach dem Login kopieren

Sehen Sie sich den Code mit dem Delegaten genau an,
public void Description(string programerName, DescriptionDelegate description). Beim Aufruf wird die

DescriptionDelegate-Beschreibung in pm.CsharpProgramer übergeben, d. h. zu diesem Zeitpunkt description=pm.CsharpProgramer. Tatsächlich können wir es auch so nennen:



Ergebnis:

                    //方法和委托绑定
            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                csharpDelegate = pm.CsharpProgramer;

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                cdelegate = pm.CProgramer;

            pm.Description("杨友山", csharpDelegate);

            pm.Description("D.M.Ritchie", cdelegate);
Nach dem Login kopieren

Erneut ändern:

Ergebnis :

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pm.Description("杨友山", pdelegate);
Nach dem Login kopieren

Hier wird zuerst pm.CsharpProgramer und dann die Methode pm.CProgramer ausgeführt. Es ist ersichtlich, dass der Delegat nicht nur Methoden als Parameter verwenden, sondern auch Methoden binden und mehrere Methoden binden kann.

Verwenden Sie += zum Binden der Methode und -= zum Abbrechen. Der obige Aufruf kann wie folgt geändert werden:



Auf diese Weise wird nur eine Methode pm.CsharpProgramer aufgerufen.

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pdelegate -= pm.CProgramer;

            pm.Description("杨友山", pdelegate);
Nach dem Login kopieren
Das Obige ist der Inhalt der C#-Grundwissenskompilierung. Grundwissen (20) Kommission (1) Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Active Directory mit C# Active Directory mit C# Sep 03, 2024 pm 03:33 PM

Leitfaden zu Active Directory mit C#. Hier besprechen wir die Einführung und die Funktionsweise von Active Directory in C# sowie die Syntax und das Beispiel.

C#-Serialisierung C#-Serialisierung Sep 03, 2024 pm 03:30 PM

Leitfaden zur C#-Serialisierung. Hier besprechen wir die Einführung, die Schritte des C#-Serialisierungsobjekts, die Funktionsweise bzw. das Beispiel.

Zufallszahlengenerator in C# Zufallszahlengenerator in C# Sep 03, 2024 pm 03:34 PM

Leitfaden zum Zufallszahlengenerator in C#. Hier besprechen wir die Funktionsweise des Zufallszahlengenerators, das Konzept von Pseudozufallszahlen und sicheren Zahlen.

C#-Datenrasteransicht C#-Datenrasteransicht Sep 03, 2024 pm 03:32 PM

Leitfaden zur C#-Datenrasteransicht. Hier diskutieren wir die Beispiele, wie eine Datenrasteransicht aus der SQL-Datenbank oder einer Excel-Datei geladen und exportiert werden kann.

Muster in C# Muster in C# Sep 03, 2024 pm 03:33 PM

Leitfaden zu Mustern in C#. Hier besprechen wir die Einführung und die drei wichtigsten Arten von Mustern in C# zusammen mit ihren Beispielen und der Code-Implementierung.

Fakultät in C# Fakultät in C# Sep 03, 2024 pm 03:34 PM

Leitfaden zur Fakultät in C#. Hier diskutieren wir die Einführung in die Fakultät in C# zusammen mit verschiedenen Beispielen und Code-Implementierungen.

Primzahlen in C# Primzahlen in C# Sep 03, 2024 pm 03:35 PM

Leitfaden zu Primzahlen in C#. Hier besprechen wir die Einführung und Beispiele von Primzahlen in C# sowie die Codeimplementierung.

Der Unterschied zwischen Multithreading und asynchronem C# Der Unterschied zwischen Multithreading und asynchronem C# Apr 03, 2025 pm 02:57 PM

Der Unterschied zwischen Multithreading und Asynchron besteht darin, dass Multithreading gleichzeitig mehrere Threads ausführt, während asynchron Operationen ausführt, ohne den aktuellen Thread zu blockieren. Multithreading wird für rechenintensive Aufgaben verwendet, während asynchron für die Benutzerinteraktion verwendet wird. Der Vorteil des Multi-Threading besteht darin, die Rechenleistung zu verbessern, während der Vorteil von Asynchron nicht darin besteht, UI-Threads zu blockieren. Die Auswahl von Multithreading oder Asynchron ist von der Art der Aufgabe abhängt: Berechnungsintensive Aufgaben verwenden Multithreading, Aufgaben, die mit externen Ressourcen interagieren und die UI-Reaktionsfähigkeit asynchron verwenden müssen.

See all articles