事件

事件:基于委托的,为委托提供一个发布/订阅的机制 ,可以说事件是一个具有特殊签名的委托。

事件关键字:event  是在委托上面加上关键字 ,加上之后在使用委托的时候会增加一些限制。

下面我们通过一个实例来认识事件:

题目:有一个懒人(LazyMan)类,它有一个名字(Name)属性,有两个方法TakeFood和GetFood分别执行"买饭"和"拿快递"。有一个工具人(ToolMan)类,它也有Name属性和一个"下楼"方法。创建事件,当工具人下楼时才能执行TakeFood和GetFood方法。

创建LazyMan类:

 internal class LazyMan
 {
     public string Name { get; set; }

     public LazyMan(string name)
     {
         this.Name = name;

     }

     public void TakeFood()
     {
         Console.WriteLine($"{Name}买饭");
     }

     public void GetFoot()
     {
         Console.WriteLine($"{Name}拿快递");

     }
 }

创建ToolMan类:

由以下代码可知,只有执行Down方法,工具人下楼,才能执行委托中的方法。

internal class ToolMan
{
    public string Name { get; set; }

    public ToolMan(string name)
    {
        Name = name;
    }

    public delegate void DownDelgate();


    //event 是在委托上面加上关键字  加上之后在使用委托的时候会增加一些限制 
    public event DownDelgate downDelgate = null;

    //调用事件的函数
    public void Down()
    {
        Console.WriteLine($"{Name}下楼了");
        downDelgate();
    }
}

Main方法使用:

由代码可知,将实例化出来的对象中的方法订阅给为委托,调用Down方法是,事件触发,委托中的方法执行。

static void Main(string[] args)
{
    // 事件
    //基于委托的 为委托提供一个发布/订阅的机制  可以说事件是一个具有特殊签名的委托

    //LazyMan L = new LazyMan("小明");
    //L.TakeFood();
    //LazyMan L1 = new LazyMan("小张");
    //L1.GetFoot();


    ToolMan T = new ToolMan("怨种");
    LazyMan L1 = new LazyMan("小明");
    LazyMan L2 = new LazyMan("小张");
    LazyMan L3 = new LazyMan("小李");
    LazyMan L4 = new LazyMan("小吴");

    //订阅
    T.downDelgate += L1.TakeFood;
    T.downDelgate += L2.TakeFood;
    T.downDelgate += L3.TakeFood;

    //取消订阅
    T.downDelgate -= L4.TakeFood;


    //Console.WriteLine("怨种出发了");
    // 
    //T.Down();
    // 工具人还没下楼 委托的事件也发生了 这不合理
    //这样写 直接调用委托 会发现 工具人还没有下楼就执行了操作  事件还没有执行 怎么解决?   事件
    //T.downDelgate();

    T.Down();

}

运行结果:

事件实例练习

题目:有个高档的热水器,包含一个加热器,一个报警器和一个现实屏,我们给热水器它通上电,当水温超过95度的时候:
           // 1、报警器会开始发出语音,告诉你水的温度;
           //2、液晶屏也会改变水温的显示,来提示水已经快烧开了。

定义一个Class1类创建事件:

 internal class Class1
 {
     //创建了一个事件
     public event Action<int> action;

     public void Boilwater()
     {
         for (int i = 0; i <= 100; i++)
         {
             if (i >= 95)
             {
                 action(i);
             }
         }
     }
 }

定义一个Xianshi类:

 internal class Xianshi
 {
     public void ShowMsg(int param)
     {
         Console.WriteLine($"水温到了 当前水温{param}");
     }
 }

定义一个Baojing类:

internal class Baojing
{
    public void MakeAi(int paras)
    {
        Console.WriteLine($"嘀嘀嘀:水已经{paras}");
    }
}

Main函数调用:

static void Main(string[] args)
{
    //有个高档的热水器,包含一个加热器,一个报警器和一个现实屏,我们给热水器它通上电,当水温超过95度的时候:
    // 1、报警器会开始发出语音,告诉你水的温度;
    //2、液晶屏也会改变水温的显示,来提示水已经快烧开了。
    Class1 c1 = new Class1();
    Xianshi c2 = new Xianshi();
    Baojing c3 = new Baojing();

    c1.action += c2.ShowMsg;
    c1.action += c3.MakeAi;
    c1.Boilwater();
}

运行结果:

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐