`

委托与事件

    博客分类:
  • C#
阅读更多
提到委托就要想到事件。

关于委托
1)委托是一种类型。但是委托定义了方法的类型。
2)这样,把方法做为参数进行传递成为可能。
形式
delegate void GreetingDelegate(string name);

void EnglishGreeting(string name)
void ChineseGreeting(string name)
签名相同的方法就是委托类型的,以上两种方法便是委托类型的。

传参数时只传方法名。如:直接传EnglishGreeting

委托链(作用是批处理):
委托不同于string的一个特性:可以将多个方法捆绑(委托、注册)到同一个委托对象上,形成委托链,当调用这个委托对象的时候,将依次调用委托链中的方法。

namespace WindowsFormsApplication1
{
    public delegate void Greeting(string name);//定义委托,委托是定义方法的类型
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //定义两个方法,签名(形式)与委托的签名相同。
        private void EnglishGreeting(string name) {
            MessageBox.Show("Hello,"+name);
        }
        private void ChineseGreeting(string name) {
            MessageBox.Show("你好,"+name);
        }
        //使方法成为参数成为可能
        private void MakeGreeting(string name, Greeting greeting) {
            greeting(name);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            MakeGreeting("Kobe", EnglishGreeting);//调用方法
            MakeGreeting("科比", ChineseGreeting);

            Greeting delegate1 = new Greeting(EnglishGreeting);//声明委托对象,就把方法EngishGreeting委托给对象delegate1了,也可以说委托对象delegate1代表方法EngishGreeting,以委托对象就可以采用下种用法了。
            delegate1("Kobe");
            delegate1 = ChineseGreeting;//委托对象的重新赋值
            delegate1("科比");

            //委托链,实现批处理
            delegate1 += EnglishGreeting;
            delegate1 += ChineseGreeting;
            delegate1("中国");
        }
    }
}


事件
关于事件的说法:
1)委托是一种自定义的类型。委托定义了方法的类型。
2)事件是委托的实例。使用委托实例的委托链注册一些方法。使用+=注册,-=撤销
3)当事件发生的时候,调用委托链中的这些方法。不妨称这些方法为事件处理函数。

举例:
热水器发出水开的事件
警报器接受这个事件,做出相应的动作
显示器接受这个事件,做出相应的动作

如果想让报警器和显示器能接受到这个事件,那么方法需要注册这个事件。

using Delegate;//引入命名空间

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //声明三个对象
            Heater heater=new Heater ();
            Alarm alarm=new Alarm ();
            Display display=new Display ();
            
            heater .BoilEvent +=alarm .Alert ;//注册方法
            heater .BoilEvent +=display .ShowMsg ;
            heater .BoilWater ();
        }
    }
}
namespace Delegate
{ 
    //热水器类
    public class Heater 
    {
        private int temperature = 0;
        public delegate void BoilHandler(int param);//委托是方法的类型
        public event BoilHandler BoilEvent;//事件是委托的实例,把方法委托给实例,实例就代表了方法。
        public void BoilWater() {
            for (int i = 0; i <=100 ; i++)
            {
                temperature++;
                if (temperature ==99&&BoilEvent !=null)
                {
                    BoilEvent(temperature);//实例代表了方法,所以可以用这种形式
                }
            }
        }

    }
    //报警器类
    public class Alarm
    {
        public void Alert(int temperature) 
        {
            MessageBox.Show("水开了,温度为"+temperature .ToString ());
        }
    }
    //显示器类
    public class Display
    {
        public void ShowMsg(int temperature) 
        {
            MessageBox.Show("水温现在是:"+temperature .ToString ());
        }
    }


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics