c# 委托与事件——事件(加深理解)

事件(Event)

一个用户的操作,或者说是触发事件,按钮的点击,鼠标的移动,设备的命令等。应用程序需要在事件发生时相应事件。如,中断。
c#中使用事件机制来实现线程间的通讯。

通过事件使用委托

事件在类中声明且生成,通过使用同一个类或其他类中的委托与事件处理程序相关联。
包含事件的类用于发布事件,称之为发布器(publisher)
接受该事件的类称之为 订阅器(subscriber)
事件使用 发布-订阅(publisher-subscriber) 模型。
发布器(publisher),是一个包含事件与委托定义的对象,事件和委托之间的联系也定义在这个对象中,发布器中的对象调用这个事件,并通知其他对象。
订阅器(subscriber),是一个接受事件并提供事件处理程序的对象,在发布器类中的委托调用订阅器类中的方法(事件处理程序)

声明事件(Event)

在类的内部声明事件,首先必须声明该事件的委托类型:

public delegate void myDelegateHandler(string s);

然后声明事件的本身,使用Event关键字

public event myDelegateHandler myDelegateEvent;

实例:

namespace ttest
{
/***********发布器类***********/
public class EventTest
{
    private int value;

    public delegate void NumManipulationHandler();
    public event NumManipulationHandler ChangeNum;
    protected virtual void OnNumChanged()
    {
        if (ChangeNum != null)
        {
            ChangeNum(); /* 事件被触发 */
        }
        else
        {
            Console.WriteLine("event not fire");
            Console.ReadKey(); /* 回车继续 */
        }
    }


    public EventTest()
    {
        int n = 5;
        SetValue(n);
    }


    public void SetValue(int n)
    {
        if (value != n)
        {
            value = n;
            OnNumChanged();
        }
    }
}


/***********订阅器类***********/

public class subscribEvent
{
    public void printf()
    {
        Console.WriteLine("event fire");
        Console.ReadKey(); /* 回车继续 */
    }
}

/***********触发***********/
public class MainClass
{
    public static void Main()
    {
        EventTest e = new EventTest(); /* 实例化对象,第一次没有触发事件 */
        subscribEvent v = new subscribEvent(); /* 实例化对象 */
        e.ChangeNum += new EventTest.NumManipulationHandler(v.printf); /* 注册 */
        //e.ChangeNum += v.printf; /* 注册 */
        //e.ChangeNum += E_ChangeNum; /* 注册 */
        e.SetValue(7);
        e.SetValue(11);
    }
    private static void E_ChangeNum()
    {
        Console.WriteLine("hello world!");
        //throw new NotImplementedException();
    }
  }
}

当上面的代码被编译和执行时,它会产生下列结果:
event not fire
event fire
event fire
实例2:

namespace ttest
{

/***********发布器类***********/
class Dog
{
    private String name;
    private String color;

    public delegate void Handeler(string name,string color); //定义委托
    public static event Handeler NewDog;  //定义事件

    public Dog(String Name, String Color)
    {
        name = Name;
        color = Color;
        if (NewDog != null)
        {
            Console.WriteLine("新进了一只狗 name:"+name+" color:"+color);
            NewDog(name,color);  //调用事件
        }
    }
}

class Test
{
    public static void Main(String[] args)
    {
        Dog d = new Dog("Tony", "yellow"); //因为还没有添加订阅,所以不能触发事件
        Dog.NewDog += new Dog.Handeler(Client1); //Client1添加订阅
        Dog.NewDog += new Dog.Handeler(Client2);//Client2添加订阅
        Dog d2 = new Dog("Tom", "white");
        Console.ReadKey();
    }
    static void Client1(string name, string color)
    {
        Console.WriteLine("我喜欢"+name+"这条狗!");
    }
    static void Client2(string name, string color)
    {
        Console.WriteLine("我非常想要"+name+"!");
    }
  }
}

结果:
在这里插入图片描述
第二个例子中,周游NewDog被订阅了才会触发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值