C#学习笔记之二:事件

关键字:event 
特定类型:EventHandler,EventArgs(都位于System命名空间中)

1.事件是什么?

(1)类成员的一种。委托类型。
(2)涉及两方:事件的发布者(可以定义一个事件<委托>并触发事件<调用委托>),事件的订阅者(相应特定事件并作出相应操作的类)

2.怎样使用事件?

(1)声明一个事件
public (staticevent EventHandler eventName;
这样就定义了一个事件eventName(static可选)。
A.event是关键字,表明这句声明是一个事件;
B.EventHandler是预定义的委托类型,其签名固定如下:
public delegate void EventHandler(Object sender, EventArgs e);
也就是说,订阅该事件的对象的事件处理方法要与此有相匹配的签名。
C.sender参数:保存触发事件的对象的引用,即这个sender是发送事件的源对象。
D.e参数:保存事件数据。如果不对EventArgs进行继承,这个值是不能保存数据的。
(2)订阅一个事件
首先要有事件处理方法
public void EventProcessMethod(Object sender, EventArgs e)
{
    //Process Notification
}
其次将方法添加到该事件(委托)中去(在事件订阅者的类中)。
//定义了某事件的类实例sample
sample.eventName += EventProcessMethod;
(3)触发一个事件
触发事件和调用函数一样,但是最好先判断事件是否已经绑定事件处理方法再进行触发。
if(eventName != null)
{
    eventName(thisnew EventArgs());
}
(4)退订一个事件
退订事件和从委托中删除方法的做法相同,使用 -= 就可以了。

3.三个扩展用法

(1)扩展EventArgs使得参数e可以包含事件数据,通常必须和(2)一起使用,做法是继承EventArgs。
public class SubEventArgs : EventArgs
{
    public string Param
    {
        get;
        set;
    }
    public SubEventArgs(string param)
    {
        Param = param;
    }
}
但是这样的SubEventArgs类型并不能出现在事件处理方法中(不满足逆变的条件),所以此时我们需要自定义委托来声明事件。
(2)扩展自定义委托声明事件
A.首先声明一个自定义委托:
public delegate void OurEventHandler(Object sender, SubEventArgs e);
B.其次将事件声明中的预定义EventHandler类型替换成我们的自定义类型:
public event OurEventHandler eventName;
C.可以在事件处理方法中使用e的属性的成员变量了,在触发时传递参数给e的属性和成员变量。
(3)事件访问器
类似于属性访问器。在大多数情况下都不需要提供自定义的事件访问器。 如果您在代码中没有提供自定义的事件访问器,编译器会自动添加事件访问器。 但在某些情况下,您可能需要提供自定义行为,就需要自定义一个事件访问器。语法是这样的:
A.定义一个委托类型变量:
public delegate void OurEventHandler(Object sender, EventArgs e);
B.声明一个此委托类型的私有变量(用于保存对订阅事件的处理方法的引用):
private OurEventHandler ourHandler;
C.在事件访问器中对这个变量进行操作:
public event OurEventHadler eventName
{
    add
    {
        ourHandler += value;
    }
    remove
    {
        ourHandler -= value;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值