[MSDN]如何:发布符合 .NET Framework 准则的事件(C# 编程指南)
Posted on 2011-12-14 11:21 Jessie.M 阅读(291) 评论(0) 编辑 收藏 举报原文:http://msdn.microsoft.com/zh-cn/library/w369ty8x.aspx
MSDN的解释看的有点晕,总结一下需要注意的几点:
如果有理解的不对的地方,请路过的朋友看到发挥下同情心一定告知,不胜感激!
自定义一个事件并处理它需要完整的四个步骤:
1.声明一个委托类型
2.声明此委托类型的事件
3.在需要抛出事件的类中发布事件
4.在需要处理事件的类中订阅事件(即指定此事件的处理函数)
但是,
MSDN:
虽然您定义的类中的事件可基于任何有效委托类型(甚至是可返回值的委托),但是,通常建议您使用 EventHandler 让事件基于 .NET Framework 模式
所以看看怎么使用.NET Framework模式的事件。
.NET中已声明了两种委托类型:
1:EventHandler 非泛型委托 (不可传递参数)
其中:EventArgs类不包含事件数据,在事件引发时不向事件处理程序传递状态信息的事件会使用此类。
2:EventHandler<TEventArgs> 泛型委托 (可传递参数,如果需要与事件一起发送一个自定义数据类的对象,则这个数据类必须继承自EventArgs类)
public delegate void EventHandler<TEventArgs>(
Object sender,
TEventArgs e
)
where TEventArgs : EventArgs
所以在使用.NET框架的事件时注意:
1.定义自己需要传递的数据类型,使之继承自EventArgs类(如果在抛出事件时不需要传递参数,则省略此步)
2.关于何时仍需要自己声明委托:
1)如果要带返回值,则必须声明自己的委托,委托以 EventHandler 结尾;
2)如果不用带返回值,也不用传递参数,则使用.NET中的EventHandler 非泛型委托即可,不用自己声明;
3)如果不用带返回值,但需要传递参数:
a)使用非泛型委托,需自己声明,如:
public delegate void CustomEventHandler(object sender, CustomEventArgs a);
b)使用.NET泛型委托,不用自己声明,直接声明委托事件即可,如:
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
在Winform编程中,窗口间经常要有数据交互,事件就很有用。例如在主窗口中控件选中一个用户单击编辑,弹出一个编辑框,在编辑框修改user,将修改更新到主窗口中的user对象、主窗口中控件所显示的user内容。如果在弹出对话框时直接将主窗口本身和user所在的usermanagement管理类对象传给编辑窗口,在编辑窗口中直接操作修改这两个对象,则1耗费内存,2逻辑不好。应该本着:控件/数据对象属于哪个类就在哪个类编辑的原则实现。
考虑在编辑窗口类中定义userEdited事件,当编辑完成单击OK时将编辑框内的新值封装成一个newuser对象,抛出userEdited事件并将newuser当做参数传递出去。在主窗口中订阅这一事件的处理函数为usermanagement类中相应的的user编辑函数,操作便可实现。