• C# 委托和事件


    一、委托

    1. 定义

      委托是一个类,它定义了方法的类型,使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时,可以依次调用所有绑定的方法。

    2. 测试事例

      假如你需要向别人问好,在国际化社会,你可能需要用多种语言问候。

      普通的思路可以用 if 或者 swith 判断然后调用相应的代码,但是可拓展行差。

      下面介绍使用委托的办法。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Delegate
     8 {
     9     /// <summary>
    10     /// 委托定义方法的签名,没有函数体
    11     /// 委托可以定义在类外面
    12     /// </summary>
    13     /// <param name="name">姓名</param>
    14     public delegate void GreetingDelegate(string name);
    15 
    16     class Program
    17     {
    18         /// <summary>
    19         /// 英文问候
    20         /// 注意函数签名要与委托相同
    21         /// </summary>
    22         /// <param name="name">姓名</param>
    23         private static void EnglishGreeting(string name)
    24         {
    25             Console.WriteLine("Morning! " + name);
    26         }
    27 
    28         /// <summary>
    29         /// 中文问候
    30         /// 注意函数签名要与委托相同
    31         /// </summary>
    32         /// <param name="name">姓名</param>
    33         private static void ChineseGreeting(string name)
    34         {
    35             Console.WriteLine("早上好! " + name);
    36         }
    37 
    38         /// <summary>
    39         /// 问候
    40         /// </summary>
    41         /// <param name="name">姓名</param>
    42         /// <param name="greeting">委托</param>
    43         private static void GreetPeople(string name, GreetingDelegate greetingDelegate)
    44         {
    45             greetingDelegate(name);                 // 调用绑定的方法
    46         }
    47 
    48         static void Main(string[] args)
    49         {
    50             GreetingDelegate greetingDelegate;
    51             // 注意 第一次绑定要用 =
    52             greetingDelegate = EnglishGreeting;     // 将英文问候绑定到委托
    53             GreetPeople("Lin", greetingDelegate);   // 此时绑定了一个个方法
    54             greetingDelegate += ChineseGreeting;    // 再将中文问候绑定到委托
    55             GreetPeople("Lin", greetingDelegate);   // 此时绑定了两个方法
    56             greetingDelegate -= EnglishGreeting;    // 将英文问候从委托中移除
    57             GreetPeople("Lin", greetingDelegate);   // 此时绑定了一个个方法
    58 
    59             Console.ReadKey();
    60         }
    61     }
    62 }

     3. 运行截图

     

    二、事件

    1. 委托和事件的区别

      委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一。

    2. 测试事例

      我们还是使用上述委托所用的事例,那么使用事件的代码如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace Event
     8 {
     9     /// <summary>
    10     /// 委托定义方法的签名,没有函数体
    11     /// 委托可以定义在类外面
    12     /// </summary>
    13     /// <param name="name">姓名</param>
    14     public delegate void GreetingDelegate(string name);
    15     
    16     /// <summary>
    17     /// 问候管理类
    18     /// </summary>
    19     public class GreetingManage
    20     {
    21         public event GreetingDelegate makeGreet;       // 声明事件
    22 
    23         public void GreetPeople(string name)            // 问候
    24         {
    25             if (makeGreet != null)
    26             {
    27                 makeGreet(name);
    28             }
    29         }
    30     }
    31 
    32     class Program
    33     {
    34         /// <summary>
    35         /// 英文问候
    36         /// 注意函数签名要与委托相同
    37         /// </summary>
    38         /// <param name="name">姓名</param>
    39         private static void EnglishGreeting(string name)
    40         {
    41             Console.WriteLine("Morning! " + name);
    42         }
    43 
    44         /// <summary>
    45         /// 中文问候
    46         /// 注意函数签名要与委托相同
    47         /// </summary>
    48         /// <param name="name">姓名</param>
    49         private static void ChineseGreeting(string name)
    50         {
    51             Console.WriteLine("早上好! " + name);
    52         }
    53 
    54         static void Main(string[] args)
    55         {
    56             GreetingManage gm = new GreetingManage();
    57             //gm.makeGreet = EnglishGreeting;       // 报错,不能用 = 赋值
    58             gm.makeGreet += EnglishGreeting;        // 添加绑定方法
    59             gm.makeGreet += ChineseGreeting;
    60             gm.GreetPeople("Lin");                  // 此时绑定了两个方法
    61             gm.makeGreet -= EnglishGreeting;        // 去除绑定
    62             gm.GreetPeople("Lin");                  // 此时绑定了一个方法
    63 
    64             Console.ReadKey();
    65         }
    66     }
    67 }

    3. 运行截图

     

  • 相关阅读:
    10 个超棒的 JavaScript 简写技巧
    不掌握这些坑,你敢用BigDecimal吗?
    Java 8之Lambda表达式的写法套路
    设计好接口的36个锦囊
    喜提JDK的BUG一枚!多线程的情况下请谨慎使用这个类的stream遍历。
    Java 设计模式
    浅谈 ThreadLocal 的实际运用
    JavaScript设计模式es6(23种)
    JAVA中简单的for循环竟有这么多坑,但愿你没踩过
    2.24 Go之信息管理系统
  • 原文地址:https://www.cnblogs.com/coderJiebao/p/CSharp05.html
Copyright © 2020-2023  润新知