• c# 委托和事件



    C#的委托和事件


    委托:给我的第一感觉就是C++的函数指针,两者几乎一样。

    不过他们有本质的区别:委托对象是一个对象,而函数指针是一个函数的入口地址

    事件: 由两部分组成,一个事件发布者,一个事件接受者

    事件发布者:

    • 定义一个委托(delegate)
    • 定义一个事件 (event)
    • 定义触发事件的方法

    事件接受者

    • 定义事件处理方法
    • 注册事件 (实例化一个委托并加入到事件中)

    附图:


    一个简单例子:

    两个类:猫和老鼠, 都有叫的方法。 当猫叫的时候,触发老鼠叫


    public class Cat : Animal
    {
    	public Cat (String name) : base(name) {}
    	public Cat () : base() {}
    
    	//声明一个委托,具体参数见附
    	public delegate void CatShoutEventHandle(Object sender, CatShoutEventArgs args);
    	//声明一个事件
    	public event CatShoutEventHandle CatShout;
    
    	public override void shout() 
    	{
    		Console.Write( name + ":喵喵喵~
    ");
    
    		if(CatShout != null) 
    		{
    			CatShoutEventArgs e = new CatShoutEventArgs();
    			e.Name = this.name;
    			CatShout(this, e);
    		}
    	}
    }       
    

    public class Mouse : Animal
    {
    	public Mouse () : base(){}
    	public Mouse (String name) : base(name) {}
    
    	public void run(Object sender, CatShoutEventArgs e) 
    	{
    		Console.WriteLine(this.name+ ": " + e.Name + "猫来了,赶紧逃!");
    	}
    }
    

    class MainClass
    {
    	public static void Main (string[] args)
    	{
    		Cat cat = new Cat("Tom");
    		Mouse mouseJack = new Mouse("Jack");
    		Mouse mouseJerry = new Mouse("Jerry");
    
    		//注册事件
    		cat.CatShout += new Cat.CatShoutEventHandle(mouseJack.run);
    		cat.CatShout += new Cat.CatShoutEventHandle(mouseJerry.run);
    
    		cat.shout ();
    	}
    }
    

    附:

    Observer(观察者)设计模式:

    Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态
    改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式。

    .Net Framework中的委托与事件

    .Net Framework的编码规范:
    委托类型的名称都应该以EventHandler结束。
    委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
    许多事件处理函数都是这样的

    事件的命名为 委托去掉 EventHandler之后剩余的部分。
    继承自EventArgs的类型应该以EventArgs结尾。

    再做一下说明:委托声明原型中的Object类型的参数代表了Subject,
    也就是监视对象,回调函数可以通过它访问触发事件的对象。
    EventArgs 对象包含了Observer所感兴趣的数据

  • 相关阅读:
    OC练习题
    如何将字符串@“ abc123.xyz789”倒置
    整数转换成字符串倒叙放在数组中遍历
    查找名字中有王的姓
    查询单词里包含的字符串
    OC7考核
    OC考核测试题
    OC6考核
    OC5考核
    KH8
  • 原文地址:https://www.cnblogs.com/newscar/p/4256571.html
Copyright © 2020-2023  润新知