Zum Fußzeileninhalt springen
Iron Academy Logo
Lernen Sie C#
Lernen Sie C#

Andere Kategorien

C# Delegate verstehen

Tim Corey
1h 9m 11s

Delegates in C# sind eine leistungsstarke Funktion, doch viele Entwickler sind mit ihrer effektiven Nutzung nicht vertraut. Das Video von Tim Corey über "Delegates in C# - Eine praktische Demonstration, einschließlich Action und Func" bietet eine gründliche Erklärung, was Delegates sind, wie man sie verwendet und warum sie nützlich sind.

In diesem Artikel erfahren Sie, was Tim über Delegates in C# weiß, und erhalten eine klare Erklärung ihrer Verwendung und praktischen Anwendungen. Sie werden lernen, wie Delegierte die Flexibilität und Effizienz Ihres Codes verbessern können, mit Beispielen wie ihrer Verwendung in einem Einkaufswagensystem.

Einführung

Tim führt in das Konzept der Delegates ein und hebt deren Leistungsfähigkeit und Vielseitigkeit in C# hervor. Er versichert den Zuschauern, dass trotz einiger einschüchternder Terminologie die Grundlage der Delegierten einfach ist. Tim zielt darauf ab, Delegates zu entmystifizieren und spezielle Typen wie func und action zu behandeln.

Demo Anwendung Walk-through

Tim richtet eine Demo-Anwendung ein, um die Verwendung von Delegaten zu veranschaulichen. Die Lösung enthält drei Projekte: eine Konsolen-Benutzeroberfläche, eine Demo-Bibliothek und eine WinForm-Benutzeroberfläche. Der Schwerpunkt liegt zunächst auf der Console UI und der Demo Library.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleUI
{
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();

        static void Main(string[] args)
        {
            PopulateCartWithDemoData();

            Console.WriteLine($"The total for the cart is {cart.GenerateTotal():C2}");

            Console.ReadLine();
        }

        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    }
}

public class ShoppingCartModel
{
    public List<ProductModel> Items { get; set; } = new List<ProductModel>();

    public decimal GenerateTotal()
    {
        decimal subtotal = Items.Sum(x => x.Price);

        if (subtotal > 100)
        {
            return subtotal * 0.80M;
        }
        else if (subtotal > 50)
        {
            return subtotal * 0.85M;
        }
        else if (subtotal > 10)
        {
            return subtotal * 0.90M;
        }
        else
        {
            return subtotal;
        }
    }
}

public class ProductModel
{
    public string ItemName { get; set; }
    public decimal Price { get; set; }
}
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleUI
{
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();

        static void Main(string[] args)
        {
            PopulateCartWithDemoData();

            Console.WriteLine($"The total for the cart is {cart.GenerateTotal():C2}");

            Console.ReadLine();
        }

        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    }
}

public class ShoppingCartModel
{
    public List<ProductModel> Items { get; set; } = new List<ProductModel>();

    public decimal GenerateTotal()
    {
        decimal subtotal = Items.Sum(x => x.Price);

        if (subtotal > 100)
        {
            return subtotal * 0.80M;
        }
        else if (subtotal > 50)
        {
            return subtotal * 0.85M;
        }
        else if (subtotal > 10)
        {
            return subtotal * 0.90M;
        }
        else
        {
            return subtotal;
        }
    }
}

public class ProductModel
{
    public string ItemName { get; set; }
    public decimal Price { get; set; }
}

Tim erklärt die Struktur und Funktionalität der Demo-Anwendung:

  • Einkaufswagen-Modell: Stellt den Einkaufswagen mit einer Liste von Artikeln (ProductModel) dar und berechnet die Gesamtkosten mit Rabatten auf Basis der Zwischensumme.

  • Produktmodell: Stellt einzelne Artikel mit Namen und Preiseigenschaften dar.

  • Konsolenanwendung: Füllt den Warenkorb mit den Demodaten, berechnet die Gesamtsumme und zeigt sie an.

Rabatte verstehen

Tim geht die Rabattlogik in der Methode GenerateTotal durch und erklärt, wie die Zwischensumme den angewandten Rabatt bestimmt:

  • 20% Rabatt für Zwischensummen über $100.
  • 15% Rabatt für Zwischensummen über $50.
  • 10% Rabatt für Zwischensummen über $10.
  • Kein Rabatt für Zwischensummen von $10 oder weniger.

Tim verwendet einen Haltepunkt, um die Berechnungs- und Rabattlogik zu veranschaulichen, um sicherzustellen, dass die Betrachter die Grundlagen verstehen, bevor sie Delegierte einführen.

Erklären und Erstellen eines Delegaten

In diesem Abschnitt taucht Tim Corey in das Konzept der Delegates in C# ein, erklärt, wie sie funktionieren und demonstriert ihre Verwendung anhand praktischer Codebeispiele.

Was ist ein Delegat?

Tim erklärt, dass ein Delegat im Wesentlichen eine Möglichkeit ist, Methoden als Parameter zu übergeben. Anstatt eine Variable oder eine Eigenschaft zu übergeben, übergeben Sie eine Methode, was einen flexibleren und wiederverwendbaren Code ermöglicht.

Erstellen und Verwenden eines Delegaten

Im Folgenden erläutert Tim den Prozess der Erstellung und Verwendung eines Delegaten:

  1. Definieren Sie den Delegaten:

    • Der Delegat wird am Anfang der Klasse definiert, wobei der Rückgabetyp und die Parametertypen angegeben werden.
    public delegate void MentionDiscount(decimal subtotal);
    public delegate void MentionDiscount(decimal subtotal);
    • Dieser Delegat gibt eine Methode an, die void zurückgibt und einen Dezimalwert als Parameter annimmt.
  2. Verwendung des Delegaten in einer Methode:

    • Der Delegat wird als Parameter in der Methode GenerateTotal der Klasse ShoppingCartModel verwendet.
    public decimal GenerateTotal(MentionDiscount mentionDiscount)
    {
        decimal subtotal = Items.Sum(x => x.Price);
    
        // Call a method passed as a delegate
        mentionDiscount(subtotal);
    
        if (subtotal > 100)
        {
            return subtotal * 0.80M;
        }
        else if (subtotal > 50)
        {
            return subtotal * 0.85M;
        }
        else if (subtotal > 10)
        {
            return subtotal * 0.90M;
        }
        else
        {
            return subtotal;
        }
    }
    public decimal GenerateTotal(MentionDiscount mentionDiscount)
    {
        decimal subtotal = Items.Sum(x => x.Price);
    
        // Call a method passed as a delegate
        mentionDiscount(subtotal);
    
        if (subtotal > 100)
        {
            return subtotal * 0.80M;
        }
        else if (subtotal > 50)
        {
            return subtotal * 0.85M;
        }
        else if (subtotal > 10)
        {
            return subtotal * 0.90M;
        }
        else
        {
            return subtotal;
        }
    }
  3. Erstellen einer Methode zur Übergabe an den Delegaten:

    • Eine Methode, die der Signatur des Delegaten entspricht, wird in der Klasse Program erstellt.
    private static void SubtotalAlert(decimal subtotal)
    {
        Console.WriteLine($"The subtotal is {subtotal:C2}");
    }
    private static void SubtotalAlert(decimal subtotal)
    {
        Console.WriteLine($"The subtotal is {subtotal:C2}");
    }
  4. Aufruf der Methode GenerateTotal:

    • Die Methode wird über den Delegaten an die Methode GenerateTotal übergeben.
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal(SubtotalAlert):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    }
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal(SubtotalAlert):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    }

Ausführung der Anwendung

Tim führt die Anwendung aus, um zu demonstrieren, wie der Delegat funktioniert. Die Konsolenausgabe zeigt die Zwischensumme und die Gesamtsumme des Warenkorbs an, was darauf hindeutet, dass die Methode SubtotalAlert erfolgreich übergeben und über den Delegaten ausgeführt wurde.

Understanding Csharp Delegate 1 related to Ausführung der Anwendung

Func und Action: Probleme, die Sie mit Delegaten lösen können

Tim Corey erforscht dann die Verwendung von func- und action-Delegates in C#. Dies sind spezielle Arten von Delegaten, die von Microsoft bereitgestellt werden, um die Verwendung von Delegaten mit Generika zu vereinfachen.

Das Problem erkennen

Tim weist auf ein häufiges Problem hin: hart kodierte Rabattlogik in der Methode GenerateTotal. Dieser Ansatz ist unflexibel und erfordert Codeänderungen, Neukompilierung und erneute Bereitstellung, sobald sich die Rabattregeln ändern.

public decimal GenerateTotal()
{
    decimal subtotal = Items.Sum(x => x.Price);
    if (subtotal > 100)
    {
        return subtotal * 0.80M;
    }
    else if (subtotal > 50)
    {
        return subtotal * 0.85M;
    }
    else if (subtotal > 10)
    {
        return subtotal * 0.90M;
    }
    else
    {
        return subtotal;
    }
}
public decimal GenerateTotal()
{
    decimal subtotal = Items.Sum(x => x.Price);
    if (subtotal > 100)
    {
        return subtotal * 0.80M;
    }
    else if (subtotal > 50)
    {
        return subtotal * 0.85M;
    }
    else if (subtotal > 10)
    {
        return subtotal * 0.90M;
    }
    else
    {
        return subtotal;
    }
}

Einführung in Func Delegate

Tim stellt den func-Delegaten vor, um das Problem der hart kodierten Rabatte zu lösen. Der func-Delegat ist ein generischer Delegat, der eine Methodensignatur mit einem Rückgabetyp und bis zu 16 Eingabeparametern darstellt.

  1. Definieren des Func Delegate:

    • Der func-Delegat wird in der GenerateTotal-Methode verwendet, um Rabattberechnungen dynamisch durchzuführen.
    public decimal GenerateTotal(Func<List<ProductModel>, decimal, decimal> calculateDiscountedTotal)
    {
        decimal subtotal = Items.Sum(x => x.Price);
        MentionDiscount(subtotal);
    
        return calculateDiscountedTotal(Items, subtotal);
    }
    public decimal GenerateTotal(Func<List<ProductModel>, decimal, decimal> calculateDiscountedTotal)
    {
        decimal subtotal = Items.Sum(x => x.Price);
        MentionDiscount(subtotal);
    
        return calculateDiscountedTotal(Items, subtotal);
    }
  2. Erstellung der Rabattberechnungsmethode:

    • Eine Methode, die der Signatur des func-Delegaten entspricht, wird in der Klasse Program erstellt.
    private static decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
    {
        if (subtotal > 100)
        {
            return subtotal * 0.80M;
        }
        else if (subtotal > 50)
        {
            return subtotal * 0.85M;
        }
        else if (subtotal > 10)
        {
            return subtotal * 0.90M;
        }
        else
        {
            return subtotal;
        }
    }
    private static decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
    {
        if (subtotal > 100)
        {
            return subtotal * 0.80M;
        }
        else if (subtotal > 50)
        {
            return subtotal * 0.85M;
        }
        else if (subtotal > 10)
        {
            return subtotal * 0.90M;
        }
        else
        {
            return subtotal;
        }
    }
  3. Übergabe der Methode an den Func-Delegaten:

    • Die Methode CalculateLevelDiscount wird über den func-Delegaten an die Methode GenerateTotal übergeben.
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal(CalculateLevelDiscount):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    
        private static decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
        {
            if (subtotal > 100)
            {
                return subtotal * 0.80M;
            }
            else if (subtotal > 50)
            {
                return subtotal * 0.85M;
            }
            else if (subtotal > 10)
            {
                return subtotal * 0.90M;
            }
            else
            {
                return subtotal;
            }
        }
    }
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal(CalculateLevelDiscount):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    
        private static decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
        {
            if (subtotal > 100)
            {
                return subtotal * 0.80M;
            }
            else if (subtotal > 50)
            {
                return subtotal * 0.85M;
            }
            else if (subtotal > 10)
            {
                return subtotal * 0.90M;
            }
            else
            {
                return subtotal;
            }
        }
    }

Ausführung der Anwendung

Tim demonstriert die geänderte Anwendung und zeigt, dass sie korrekt funktioniert und den Rabatt auf der Grundlage der vorgegebenen Logik dynamisch berechnet.

Understanding Csharp Delegate 2 related to Ausführung der Anwendung

Unterschiede zwischen Delegate und Func

Tim vergleicht den benutzerdefinierten Delegaten und den func-Delegaten:

  • Delegate: Erfordert eine explizite Definition der Signatur und eine klare Dokumentation und Struktur.

  • Func: Ist prägnanter, erfordert aber jedes Mal die Angabe von Eingabe- und Ausgabetypen, was weniger klar sein kann.

Beide Ansätze bieten Flexibilität, aber die Wahl hängt von dem spezifischen Anwendungsfall und der Komplexität der Anwendung ab.

Warum Delegaten verwenden, wenn die ganze Arbeit anderswo erledigt wird?

Tim Corey geht auf eine häufig gestellte Frage zur Verwendung von Delegaten ein: Warum einen Delegaten haben, wenn die ganze Arbeit an anderer Stelle erledigt wird?

Tim erklärt, dass der Zweck von Delegierten darin besteht, Flexibilität und Erweiterbarkeit im Code zu ermöglichen. Die Methode GenerateTotal in der Klasse ShoppingCartModel kann mehr tun als nur Rabatte zu berechnen. Sie kann auch Aufgaben wie die Überprüfung der Lagerverfügbarkeit, die Validierung des Warenkorbinhalts oder andere Geschäftslogiken übernehmen. Mit Delegaten können Sie spezifische Methoden für spezielle Aufgaben oder benutzerdefiniertes Verhalten übergeben, ohne die Kernmethode zu ändern. Dadurch wird der Code modularer und leichter zu pflegen.

Delegierte sind besonders nützlich in Szenarien, in denen Sie:

  • Verschiedene Geschäftsregeln oder Logik dynamisch anwenden.
  • Die Kernmethode sollte generisch und wiederverwendbar sein.
  • Implementieren Sie benutzerdefiniertes Verhalten für bestimmte Fälle, ohne die Kernmethode zu ändern.

Aktionsdelegat: Erstellen und Erläutern

Tim stellt den Action-Delegaten vor, einen weiteren speziellen Typ von Delegaten in C#. Der Action-Delegat ist ähnlich wie Func, gibt aber keinen Wert zurück (d. h., er liefert void).

  1. Erstellen des Action Delegate:

    • Definieren Sie den Action-Delegaten in der GenerateTotal-Methode, um Warnungen oder Nachrichten zu behandeln.
    public decimal GenerateTotal(Func<List<ProductModel>, decimal, decimal> calculateDiscountedTotal, Action<string> tellUserWeAreDiscounting)
    {
        decimal subtotal = Items.Sum(x => x.Price);
        MentionSubtotal(subtotal);
    
        tellUserWeAreDiscounting("We are applying your discount.");
    
        return calculateDiscountedTotal(Items, subtotal);
    }
    public decimal GenerateTotal(Func<List<ProductModel>, decimal, decimal> calculateDiscountedTotal, Action<string> tellUserWeAreDiscounting)
    {
        decimal subtotal = Items.Sum(x => x.Price);
        MentionSubtotal(subtotal);
    
        tellUserWeAreDiscounting("We are applying your discount.");
    
        return calculateDiscountedTotal(Items, subtotal);
    }
  2. Erstellung der Alert-Methode:

    • Definieren Sie eine Methode, die der Signatur des Action-Delegaten entspricht.
    private static void AlertUser(string message)
    {
        Console.WriteLine(message);
    }
    private static void AlertUser(string message)
    {
        Console.WriteLine(message);
    }
  3. Übergabe der Methode an den Aktionsdelegaten:

    • Übergeben Sie die AlertUser-Methode an die GenerateTotal-Methode über den Action-Delegaten.
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal(CalculateLevelDiscount, AlertUser):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    
        private static decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
        {
            if (subtotal > 100)
            {
                return subtotal * 0.80M;
            }
            else if (subtotal > 50)
            {
                return subtotal * 0.85M;
            }
            else if (subtotal > 10)
            {
                return subtotal * 0.90M;
            }
            else
            {
                return subtotal;
            }
        }
    
        private static void AlertUser(string message)
        {
            Console.WriteLine(message);
        }
    }
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal(CalculateLevelDiscount, AlertUser):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    
        private static decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
        {
            if (subtotal > 100)
            {
                return subtotal * 0.80M;
            }
            else if (subtotal > 50)
            {
                return subtotal * 0.85M;
            }
            else if (subtotal > 10)
            {
                return subtotal * 0.90M;
            }
            else
            {
                return subtotal;
            }
        }
    
        private static void AlertUser(string message)
        {
            Console.WriteLine(message);
        }
    }

Erstellen von anonymen Methoden: Anonymer Delegat

Tim zeigt, wie man anonyme Methoden verwendet, die es ermöglichen, Methoden spontan zu definieren, ohne sie zu benennen.

  1. Definieren anonymer Methoden:

    • Anstatt benannte Methoden zu erstellen, können Sie die Methoden direkt dort definieren, wo sie benötigt werden.
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal((items, subtotal) => 
            {
                if (subtotal > 100) return subtotal * 0.80M;
                else if (subtotal > 50) return subtotal * 0.85M;
                else if (subtotal > 10) return subtotal * 0.90M;
                else return subtotal;
            },
            (message) => Console.WriteLine(message)):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    }
    class Program
    {
        static ShoppingCartModel cart = new ShoppingCartModel();
    
        static void Main(string[] args)
        {
            PopulateCartWithDemoData();
    
            Console.WriteLine($"The total for the cart is {cart.GenerateTotal((items, subtotal) => 
            {
                if (subtotal > 100) return subtotal * 0.80M;
                else if (subtotal > 50) return subtotal * 0.85M;
                else if (subtotal > 10) return subtotal * 0.90M;
                else return subtotal;
            },
            (message) => Console.WriteLine(message)):C2}");
    
            Console.ReadLine();
        }
    
        private static void PopulateCartWithDemoData()
        {
            cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
            cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
            cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
            cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
        }
    }
  2. Verständnis der Syntax:

    • Die anonyme Methodensyntax verwendet den => Operator (Lambda-Ausdruck), um den Methodenrumpf direkt inline zu definieren.
    • Die Angabe des Rückgabetyps oder des Methodennamens ist nicht erforderlich.

Durch die Verwendung von Delegaten, einschließlich Func-, Action- und anonymen Methoden, können Entwickler dynamischeren und modularen Code erstellen, der flexible und wiederverwendbare Komponenten ermöglicht.

Verwendung von Delegaten in anderen Projekten: WinForms

In diesem Segment demonstriert Tim Corey die Leistungsfähigkeit von Delegaten, indem er ihre Verwendung auf eine WinForms-Anwendung ausweitet. Dabei wird hervorgehoben, wie Delegierte unterschiedliche Verhaltensweisen in verschiedenen Kontexten der Benutzeroberfläche (UI) erleichtern können.

Einrichten der WinForms-Anwendung

  1. WinForms-Benutzeroberfläche mit zwei Schaltflächen :

    • Das Formular hat zwei Schaltflächen: eine zur Demonstration von Nachrichtenfeldern und eine zur Demonstration von Textfeldern.

    • Das ShoppingCartModel und eine Methode, es mit Demodaten zu füllen, sind ebenfalls enthalten.
public partial class Dashboard : Form
{
    ShoppingCartModel cart = new ShoppingCartModel();

    public Dashboard()
    {
        InitializeComponent();
        PopulateCartWithDemoData();
    }

    private void PopulateCartWithDemoData()
    {
        cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
        cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
        cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
        cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
    }

    private void messageBoxDemoButton_Click(object sender, EventArgs e)
    {
        decimal total = cart.GenerateTotal(SubtotalAlert, CalculateLevelDiscount, PrintOutDiscountAlert);
        MessageBox.Show($"The total is {total:C2}");
    }

    private void textBoxDemoButton_Click(object sender, EventArgs e)
    {
        // Code for TextBox demo will go here
    }
}
public partial class Dashboard : Form
{
    ShoppingCartModel cart = new ShoppingCartModel();

    public Dashboard()
    {
        InitializeComponent();
        PopulateCartWithDemoData();
    }

    private void PopulateCartWithDemoData()
    {
        cart.Items.Add(new ProductModel { ItemName = "Cereal", Price = 3.63M });
        cart.Items.Add(new ProductModel { ItemName = "Milk", Price = 2.95M });
        cart.Items.Add(new ProductModel { ItemName = "Strawberries", Price = 7.51M });
        cart.Items.Add(new ProductModel { ItemName = "Blueberries", Price = 6.75M });
    }

    private void messageBoxDemoButton_Click(object sender, EventArgs e)
    {
        decimal total = cart.GenerateTotal(SubtotalAlert, CalculateLevelDiscount, PrintOutDiscountAlert);
        MessageBox.Show($"The total is {total:C2}");
    }

    private void textBoxDemoButton_Click(object sender, EventArgs e)
    {
        // Code for TextBox demo will go here
    }
}

Erstellen von Methoden für Delegates

  1. PrintOutDiscountAlert :

    • Diese Methode wird verwendet, um eine Benachrichtigung mit den Rabattinformationen anzuzeigen.
    private void PrintOutDiscountAlert(string message)
    {
        MessageBox.Show(message);
    }
    private void PrintOutDiscountAlert(string message)
    {
        MessageBox.Show(message);
    }
  2. Zwischensummenalarm :

    • Bei dieser Methode wird die Zwischensumme in einem Nachrichtenfeld angezeigt.
    private void SubtotalAlert(decimal subtotal)
    {
        MessageBox.Show($"The subtotal is {subtotal:C2}");
    }
    private void SubtotalAlert(decimal subtotal)
    {
        MessageBox.Show($"The subtotal is {subtotal:C2}");
    }
  3. Berechne den Stufenrabatt :

    • Bei dieser Methode wird der Rabatt auf der Grundlage der Anzahl der Artikel im Warenkorb berechnet.
    private decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
    {
        if (items.Count > 3)
        {
            return subtotal - 3M;
        }
        return subtotal - items.Count;
    }
    private decimal CalculateLevelDiscount(List<ProductModel> items, decimal subtotal)
    {
        if (items.Count > 3)
        {
            return subtotal - 3M;
        }
        return subtotal - items.Count;
    }

Integration der Delegaten mit WinForms

  1. Verwendung von Delegaten im Button Click Event:

    • Die messageBoxDemoButton_Click Methode demonstriert, wie Delegaten an die GenerateTotal-Methode übergeben werden und die Ergebnisse mit Nachrichtenfeldern verarbeitet werden.
    private void messageBoxDemoButton_Click(object sender, EventArgs e)
    {
        decimal total = cart.GenerateTotal(SubtotalAlert, CalculateLevelDiscount, PrintOutDiscountAlert);
        MessageBox.Show($"The total is {total:C2}");
    }
    private void messageBoxDemoButton_Click(object sender, EventArgs e)
    {
        decimal total = cart.GenerateTotal(SubtotalAlert, CalculateLevelDiscount, PrintOutDiscountAlert);
        MessageBox.Show($"The total is {total:C2}");
    }
  2. Ausführen der Anwendung:

    • Wenn die Schaltfläche angeklickt wird, zeigt die WinForms-Anwendung die Zwischensumme und die Gesamtsumme mithilfe von Meldungsfeldern an und demonstriert so die Flexibilität von Delegierten.

    Understanding Csharp Delegate 3 related to Integration der Delegaten mit WinForms

Abschluss

Tim Corey erklärt Delegates in C# anschaulich und geht dabei auf die Grundlagen, die fortgeschrittene Verwendung und praktische Beispiele wie die Verwendung von Delegates in einem Einkaufswagen ein. Er zeigt, wie Delegates flexiblen und wiederverwendbaren Code ermöglichen, einschließlich Func, Action und anonyme Methoden. Sehen Sie sich das vollständige Video an und erfahren Sie, wie Sie Delegierte in Ihren Projekten effektiv einsetzen können!

Hero Worlddot related to C# Delegate verstehen
Hero Affiliate related to C# Delegate verstehen

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an