C# 在类中定义事件

事件说明

事件一定要有发出者和事件的响应者。同时事件有一定的入口参数和返回值。事件的一系列过程由委托(delegate)来完成,委托相当于函数指针,它将事件响应函数的函数指针与类的事件字段绑定一起,用来告诉事件发出者事件发出后事件的响应函数的起始位置。事件的发出者就找到了响应函数的起始位置就可以完成事件的响应了。

事件的发出者:事件字段

产生事件:由事件字段在特定的时候发出事件

事件的响应:响应函数,由委托传递响应函数的函数指针。

代码步骤

步骤①定义一个事件的委托

public delegate void SupportedProtocolClientEventHandler(AgentClient agent, string protocol);

其中:

SupportedProtocolClientEventHandler 是委托的名字,我们约定委托的名字以EventHandler结尾。

void 是委托事件的返回值类型,他规定了事件的返回值。

(AgentClient agent, string protocol) 是形参列表,他规定了事件的参数列表。

可以看出委托的定义就规定了这个事件的形参和返回值类型,即规定了一个事件类型。

注意:委托的定义一般应该定义在类体的外面,名称空间的里面。因为委托的类型是Class。当然你也可以把委托的定义放在类的内部,此时这个委托相当于类的内部类。

步骤②在类的内部创建一个事件字段

public event SupportedProtocolClientEventHandler SupportedProtocolEvent;

其中:

event 是标志了在类中定义的对象是事件字段。

SupportedProtocolClientEventHandler 是之前定义的委托,它规定了这个事件字段的事件类型,即规定了事件的形参和返回值。

SupportedProtocolEvent 是事件字段的名字,由他来发出事件。我们约定以Event结尾,因为这样便于识别这个字段是个事件字段。

注意:这里我们是用字段对外公开事件的,所以要用public关键字修饰,不然调用者无法响应该事件。

当然,你也可以将事件字段封装成属性,此时你的代码可以这样写

       private SupportedProtocolClientEventHandler SupportedProtocolEvent;
       public event SupportedProtocolClientEventHandler OnSupportedProtocol
       {
            add { SupportedProtocolEvent += value; }
            remove { SupportedProtocolEvent -= value; }
       }

这样做,就将事件封装成了一个属性。对外公开的则是SupportedProtocol不再是SupportedProtocolEvent。这里OnSupportedProtocol属性提供了一个add和一个remove用来为SupportedProtocolEvent事件字段完成绑定事件和解除绑定事件。而value是属性包装器的内置参数,此时value的类型是函数指针。

步骤③发出事件

在类的某个函数中(执行的代码中)你可能需要发出这个类型的事件,也即当你在需要发出该事件时你只需要使用:

    事件字段.Invoke(实参列表)

    事件字段(实参列表)

来发出事件。即

SupportedProtocolEvent.Invoke(this, protocol);

SupportedProtocolEvent(this, protocol);

    但是为了安全起见,你应当在发出事件前判断事件字段是否为null。于是安全的代码应当这样写:

    if(SupportedProtocolEvent != null)
                SupportedProtocolEvent.Invoke(this, protocol);

至此,在类中定义事件和发出事件的工作做完了,接下来就是在其他类中是用这个类并将这个类的事件绑定事件的响应代码(或者取消事件的响应)

步骤④绑定和解绑事件

这个过程很简单,就是调用这个类并用+=和-=来为事件绑定响应和解除响应。

绑定事件响应:

            对象.事件字段+=函数名;

            对象.事件属性+=函数名;

具体的举例:

步骤⑤事件响应函数

    略

代码举例

等待后期编辑
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章