Passer au contenu du pied de page
Iron Academy Logo
Apprendre le C#
Apprendre le C#

Autres catégories

Comprendre les délégués en C#

Tim Corey
1h 9m 11s

Les délégués dans C# sont une fonctionnalité puissante, pourtant de nombreux développeurs ne sont pas familiers avec leur utilisation efficace. La vidéo de Tim Corey intitulée "Delegates in C# - A practical demonstration, including Action and Func" explique en détail ce que sont les délégués, comment les utiliser et pourquoi ils sont utiles.

Cet article vous apportera les conseils d'expert de Tim sur les délégués en C#, en offrant une explication claire de leur utilisation et de leurs applications pratiques. Vous apprendrez comment les délégués peuvent améliorer la flexibilité et l'efficacité de votre code, avec des exemples comme leur utilisation dans un système de panier d'achat.

Introduction

Tim présente le concept des délégués, en soulignant leur puissance et leur polyvalence en C#. Il assure les téléspectateurs qu'en dépit d'une terminologie intimidante, la base des délégués est simple. Tim vise à démystifier les délégués et à couvrir les types spéciaux tels que func et action.

Démonstration d'une application

Tim met en place une application de démonstration pour illustrer l'utilisation des délégués. La solution contient trois projets : une interface console, une bibliothèque de démonstration et une interface WinForm. Dans un premier temps, l'accent est mis sur l'interface utilisateur de la console et la bibliothèque de démonstration.

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 explique la structure et les fonctionnalités de l'application de démonstration :

  • Modèle de panier : Représente le panier d'achat avec une liste d'articles (ProductModel) et calcule le coût total avec des remises basées sur le sous-total.

  • Modèle de produit : Représente les articles individuels avec des propriétés de nom et de prix.

  • Application console : Remplit le panier avec les données de démonstration, calcule le total et l'affiche.

Comprendre les remises

Tim présente la logique de remise dans la méthode GenerateTotal, en expliquant comment le sous-total détermine la remise appliquée :

  • 20 % de réduction pour les sous-totaux supérieurs à 100 $.
  • 15% de réduction pour les sous-totaux supérieurs à 50 $.
  • 10 % de réduction pour les sous-totaux supérieurs à 10 $.
  • Pas de remise pour les sous-totaux inférieurs ou égaux à 10 $.

Tim utilise un point d'arrêt pour démontrer la logique de calcul et de remise, afin de s'assurer que les spectateurs comprennent les fondements avant d'introduire les délégués.

Explication et création d'un délégué

Dans cette section, Tim Corey plonge dans le concept des délégués en C#, en expliquant leur fonctionnement et en démontrant leur utilisation à l'aide d'exemples de code pratiques.

Qu'est-ce qu'un délégué?

Tim explique qu'un délégué est essentiellement un moyen de passer des méthodes en tant que paramètres. Au lieu de passer une variable ou une propriété, vous passez une méthode, ce qui permet un code plus flexible et réutilisable.

Création et utilisation d'un délégué

Voici comment Tim décompose le processus de création et d'utilisation d'un délégué :

  1. Définir le délégué :

    • Le délégué est défini au sommet de la classe, en spécifiant le type de retour et les types de paramètres.
    public delegate void MentionDiscount(decimal subtotal);
    public delegate void MentionDiscount(decimal subtotal);
    • Ce délégué spécifie une méthode qui retourne void et prend une décimale comme paramètre.
  2. Utilisation du délégué dans une méthode :

    • Le délégué est utilisé comme paramètre dans la méthode GenerateTotal de la classe ShoppingCartModel.
    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. Création d'une méthode à passer au délégué :

    • Une méthode correspondant à la signature du délégué est créée dans la classe Program.
    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. <Appel de la méthode GenerateTotal :

    • La méthode est transmise à la méthode GenerateTotal via le délégué.
    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 });
        }
    }

Exécution de l'application

Tim exécute l'application pour démontrer le fonctionnement du délégué. La console affiche le sous-total et le total du panier, ce qui indique que la méthode SubtotalAlert a été transmise et exécutée avec succès par l'intermédiaire du délégué.

Understanding Csharp Delegate 1 related to Exécution de l'application

Func et Action : Les problèmes que vous pouvez résoudre avec les délégués

Tim Corey explore ensuite l'utilisation des délégués func et action en C#. Il s'agit de types spéciaux de délégués fournis par Microsoft pour simplifier l'utilisation des délégués avec les génériques.

Identification du problème

Tim met en évidence un problème courant : la logique de remise codée en dur dans la méthode GenerateTotal. Cette approche n'est pas flexible et nécessite des modifications du code, une recompilation et un redéploiement chaque fois que les règles d'actualisation changent.

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;
    }
}

Présentation de Func Delegate

Tim introduit le délégué func pour résoudre le problème des remises codées en dur. Le délégué func est un délégué générique qui représente une signature de méthode avec un type de retour et jusqu'à 16 paramètres d'entrée.

  1. Définition du délégué Func :

    • Le délégué func est utilisé dans la méthode GenerateTotal pour gérer les calculs de remise de manière dynamique.
    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. Création de la méthode de calcul des remises :

    • Une méthode correspondant à la signature du délégué func est créée dans la classe Program.
    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. Passer la méthode au délégué Func :

    • La méthode CalculateLevelDiscount est transmise à la méthode GenerateTotal via le délégué func.
    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;
            }
        }
    }

Exécution de l'application

Tim fait une démonstration de l'application modifiée, montrant qu'elle fonctionne correctement et qu'elle calcule dynamiquement la remise en fonction de la logique fournie.

Understanding Csharp Delegate 2 related to Exécution de l'application

Différences entre Delegate et Func

Tim compare le délégué personnalisé et le délégué func :

  • Délégué : Nécessite une définition explicite de la signature, en fournissant une documentation et une structure claires.

  • Func : Plus concis, mais nécessite de spécifier les types d'entrée et de sortie à chaque fois, ce qui peut être moins clair.

Les deux approches sont flexibles, mais le choix dépend du cas d'utilisation spécifique et de la complexité de l'application.

Pourquoi utiliser des délégués si tout le travail est fait ailleurs ?

Tim Corey répond à une question fréquente sur l'utilisation des délégués : Pourquoi avoir un délégué si tout le travail semble être fait ailleurs ?

Tim explique que l'objectif des délégués est d'assurer la flexibilité et l'extensibilité du code. La méthode GenerateTotal de la classe ShoppingCartModel peut faire plus que calculer des remises. Elle peut également prendre en charge des tâches telles que la vérification de la disponibilité des stocks, la validation du contenu du panier ou d'autres logiques commerciales. Les délégués vous permettent de passer des méthodes spécifiques pour des tâches uniques ou un comportement personnalisé sans modifier la méthode principale. Cela rend le code plus modulaire et plus facile à maintenir.

Les délégués sont particulièrement utiles dans les scénarios où vous souhaitez.. :

  • Appliquer dynamiquement différentes règles ou logiques commerciales.
  • La méthode de base doit rester générique et réutilisable.
  • Implémenter un comportement personnalisé pour des cas spécifiques sans modifier la méthode de base.

Action déléguée : Créer et expliquer

Tim présente le délégué Action, un autre type spécial de délégué en C#. Le délégué Action est similaire à Func, mais il ne renvoie pas de valeur (c'est-à-dire qu'il renvoie void).

  1. Création du délégué d'action :

    • Définissez le délégué Action dans la méthode GenerateTotal pour gérer les alertes ou les messages.
    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. Création de la méthode d'alerte :

    • Définissez une méthode correspondant à la signature du délégué Action.
    private static void AlertUser(string message)
    {
        Console.WriteLine(message);
    }
    private static void AlertUser(string message)
    {
        Console.WriteLine(message);
    }
  3. Passer la méthode au délégué d'action :

    • Transmettez la méthode AlertUser à la méthode GenerateTotal via le délégué Action.
    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);
        }
    }

Création de méthodes anonymes : Délégué anonyme

Tim montre comment utiliser les méthodes anonymes, qui permettent de définir des méthodes à la volée sans les nommer.

  1. Définition des méthodes anonymes :

    • Au lieu de créer des méthodes nommées, vous pouvez définir les méthodes directement là où elles sont nécessaires.
    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. Comprendre la syntaxe :

    • La syntaxe de méthode anonyme utilise l'opérateur => (expression lambda) pour définir le corps de la méthode directement en ligne.
    • Il n'est pas nécessaire de préciser le type de retour ou le nom de la méthode.

En utilisant les délégués, y compris les méthodes Func, Action et anonymes, les développeurs peuvent créer un code plus dynamique et plus modulaire, ce qui permet d'obtenir des composants flexibles et réutilisables.

Utilisation des délégués dans d'autres projets : WinForms

Dans ce segment, Tim Corey démontre la puissance des délégués en étendant leur utilisation à une application WinForms. Elle met en évidence la manière dont les délégués peuvent faciliter différents comportements dans divers contextes d'interface utilisateur (UI).

Mise en place de l'application WinForms

  1. WinForm UI avec deux boutons :

    • Le formulaire comporte deux boutons : l'un pour la démonstration des boîtes de message et l'autre pour la démonstration des boîtes de texte.

    • Le modèle ShoppingCartModel et une méthode pour le remplir avec des données de démonstration sont également inclus.
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
    }
}

Créer des méthodes pour les délégués

  1. PrintOutDiscountAlert :

    • Cette méthode sera utilisée pour afficher une alerte contenant des informations sur les réductions.
    private void PrintOutDiscountAlert(string message)
    {
        MessageBox.Show(message);
    }
    private void PrintOutDiscountAlert(string message)
    {
        MessageBox.Show(message);
    }
  2. SubtotalAlert :

    • Cette méthode permet d'afficher le sous-total dans une boîte de message.
    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. CalculerLevelDiscount :

    • Cette méthode calcule la réduction en fonction du nombre d'articles dans le panier.
    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;
    }

Intégration des délégués avec WinForms

  1. Utilisation de délégués dans l'événement de clic de bouton :

    • La méthode messageBoxDemoButton_Click démontre comment passer les délégués à la méthode GenerateTotal et gérer les résultats à l'aide de boîtes de message.
    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. Exécuter l'application :

    • Lorsque l'on clique sur le bouton, l'application WinForms affiche le sous-total et le total à l'aide de boîtes de message, démontrant ainsi la flexibilité des délégués.

    Understanding Csharp Delegate 3 related to Intégration des délégués avec WinForms

Conclusion

Tim Corey explique clairement les délégués en C#, en couvrant leurs bases, leur utilisation avancée et des exemples pratiques comme l'utilisation des délégués dans un panier d'achat. Il montre comment les délégués permettent un code flexible et réutilisable, y compris les méthodes Func, Action et anonymes. Regardez la vidéo complète vidéo pour apprendre à utiliser efficacement les délégués dans vos projets !

Hero Worlddot related to Comprendre les délégués en C#
Hero Affiliate related to Comprendre les délégués en C#

Gagnez plus en partageant ce que vous aimez

Vous créez du contenu pour les développeurs travaillant avec .NET, C#, Java, Python ou Node.js ? Transformez votre expertise en revenu supplémentaire !

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi