• C#中的委托和事件







    1using System;
    2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace DelegateLearning1 7 { 8 public delegate void MyDelegate(string name); 9 10 public class MyTest 11 { 12 //委托在编译的时候确实会编译成类。因为Delegate是一个类,所以在 13 //任何可以声明类的地方都可以声明委托 14 public event MyDelegate mydelegate; 15 16 public void GreetPeople(string name) 17 { 18 if (mydelegate != null)//如果有方法注册委托变量 19 { 20 mydelegate(name); //通过委托调用方法 21 } 22 } 23 } 24 class Program 25 { 26 static void Main(string[] args) 27 { 28 MyTest mt = new MyTest(); 29 mt.mydelegate += ChineseSayHi; 30 mt.mydelegate += EnglishSayHi; 31 mt.GreetPeople("lily"); 32 } 33 34 public static void ChineseSayHi(string name) 35 { 36 Console.WriteLine("{0}, 你好!",name); 37 38 } 39 40 public static void EnglishSayHi(string name) 41 { 42 Console.WriteLine("Hello,{0}!",name); 43 } 44 } 45 }
    View Code
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Delegate
     7 {
     8     class Program
     9     {
    10         // 热水器
    11         public class Heater
    12         {
    13             private int temperature;
    14             public string type = "Sun 001";                 // 添加型号作为演示
    15             public string area = "SCAUCS";                  // 添加产地作为演示
    16 
    17             //声明委托
    18             public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e);
    19             public event BoiledEventHandler Boiled;       //声明事件
    20 
    21             // 定义BoliedEventArgs类,传递给Observer所感兴趣的信息
    22             public class BoliedEventArgs : EventArgs
    23             {
    24                 public readonly int temperature;
    25                 public BoliedEventArgs(int temperature)
    26                 {
    27                     this.temperature = temperature;
    28                 }
    29             }
    30 
    31             // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
    32             protected virtual void OnBolied(BoliedEventArgs e)
    33             {
    34                 if (Boiled != null)
    35                 {       // 如果有对象注册
    36                     Boiled(this, e);       // 调用所有注册对象的方法
    37                 }
    38             }
    39 
    40             // 烧水
    41             public void BoilWater()
    42             {
    43                 for (int i = 0; i <= 100; i++)
    44                 {
    45                     temperature = i;
    46                     if (temperature > 95)
    47                     {
    48                         //建立BoliedEventArgs 对象。
    49                         BoliedEventArgs e = new BoliedEventArgs(temperature);
    50                         OnBolied(e);       // 调用 OnBolied方法
    51                     }
    52                 }
    53             }
    54         }
    55 
    56 
    57         // 警报器
    58         public class Alarm
    59         {
    60             public void MakeAlert(Object sender, Heater.BoliedEventArgs e)
    61             {
    62                 Heater heater = (Heater)sender;        //这里是不是很熟悉呢?
    63                 //访问 sender 中的公共字段
    64                 Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
    65                 Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
    66                 Console.WriteLine();
    67             }
    68 
    69         }
    70 
    71         // 显示器
    72         public class Display
    73         {
    74             public static void ShowMsg(Object sender, Heater.BoliedEventArgs e)
    75             {       //静态方法
    76                 Heater heater = (Heater)sender;
    77                 Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
    78                 Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
    79                 Console.WriteLine();
    80             }
    81         }
    82 
    83         static void Main(string[] args)
    84         {
    85             Heater heater = new Heater();
    86             Alarm alarm = new Alarm();
    87 
    88             heater.Boiled += alarm.MakeAlert;       //注册方法
    89             heater.Boiled += (new Alarm()).MakeAlert;  //给匿名对象注册方法
    90             heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);       //也可以这么注册
    91             heater.Boiled += Display.ShowMsg;              //注册静态方法
    92 
    93             heater.BoilWater();       //烧水,会自动调用注册过对象的方法
    94 
    95             Console.ReadKey();
    96         }
    97     }
    98 }

        委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,

    这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If‐Else(Switch)语句,同时使得程序具有更好的可扩展性。 

    使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用调用这个词,

    是因为此变量代表一个方法),可以依次调用所有绑定的方法。

    event封装了委托类型的变量,使得:在类的内部,不管你声明它是public

    还是protected,它总是private的。在类的外部,注册“+=”和注销“‐=”的访问限定符与你在

    声明事件时使用的访问符相同。 

    说 明:这里还有一个约定俗称的规定,就是订阅事件的方法的命名,通常为“On事件名”。

  • 相关阅读:
    数据结构(一)线性表单链表试题
    虚拟研讨会:如何设计好的RESTful API?
    如何生成RestFul Api文档
    webstorm 10 设置文件的默认编码
    HAML学习
    Nodejs初阶之express
    RESTful API 简书
    解读Nodejs多核处理模块cluster
    Nginx做NodeJS应用负载均衡配置实例
    拿nodejs快速搭建简单Oauth认证和restful API server攻略
  • 原文地址:https://www.cnblogs.com/xrong/p/3011024.html
Copyright © 2020-2023  润新知