码迷,mamicode.com
首页 > Windows程序 > 详细

C#中委托和事件的理解

时间:2017-12-27 22:40:47      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:threading   delegate   led   system   jimmy   imm   .com   c#   ++   

看了张子阳博客后,总结了一下个人的理解,原文见:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html

委托是可以把方法作为参数的一种东东。

把委托声明成与方法的返回值和参数一模一样。

然后把方法赋值给委托变量,委托变量就可以作为参数带入函数。

委托最主要的作用是实现C#中的事件。

C#中的委托型事件需要遵守几个书写规范:

1、委托名称必须以EventHandler结尾。如:PlayEventHandler

2、委托必须声明成两个参数且void,一个Object型的sender参数代表对象本身,一个EventArgs型的参数(或者继承自
EventArgs类)。如:PlayEventHandler(Object sender,EventArgs e)

3、事件变量名称就是委托名称去掉EventHandler后的前面部分。如:Play

4、需要写一个方法以On开始以事件变量名称结束,方法中判断时间变量是否为null,不为null则执行事件。如:OnPlay

5、该方法包含一个参数即委托的第二个参数EventArgs。执行事件参数为委托的两个参数。

6、继承EventArgs类的名称要以EventArgs结尾。

附上实例,修改自张子阳博客

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace firewater
{
    class Program
    {
        static void Main(string[] args)
        {
            heater ht = new heater();
            Alerter at = new Alerter();
            ht.Boiled += at.MakeAlert;
            ht.Boiled += Shower.showtemp;
            ht.BoilWater();
            Console.ReadKey();
        }
    }

    class heater
    {
        private int temperature;
        public string area = "重庆";
        public string type = "日晓101";

        public class BoiledEventArgs : EventArgs
        {
            public readonly int temperature;
            public BoiledEventArgs(int temperature)
            {
                this.temperature = temperature;
            }
        }

        public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);  //声明委托
        public event BoiledEventHandler Boiled;  //声明委托型事件

        protected virtual void OnBoiled(BoiledEventArgs e)
        {
            if(Boiled!=null)
            {
                Boiled(this,e);
            }
        }

        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (i > 95)
                {
                    BoiledEventArgs e = new BoiledEventArgs(temperature);
                    OnBoiled(e);
                }
            }
        }
    }

    class Alerter
    {
        public void MakeAlert(Object sender,heater.BoiledEventArgs e)
        {
            heater ht=(heater)sender;

            Console.WriteLine("水壶型号{0}", ht.type);
            Console.WriteLine("水壶产地{0}", ht.area);
            Console.WriteLine("嘀嘀嘀...水快开了!水温是{0}",e.temperature);
        }
    }

    class Shower
    {
        public static void showtemp(Object sender, heater.BoiledEventArgs e)
        {
            heater ht = (heater)sender;

            Console.WriteLine("水壶型号{0}", ht.type);
            Console.WriteLine("水壶产地{0}", ht.area);
            Console.WriteLine("当前水温:{0}", e.temperature);
        }
    }
}

 

C#中委托和事件的理解

标签:threading   delegate   led   system   jimmy   imm   .com   c#   ++   

原文地址:https://www.cnblogs.com/microyx/p/8127723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!