C#事件Event

1.了解事件Event
能够发生的什么事情
C#角色:使对象或类具备通知能力的成员
事件是一种使对象或类能够提供通知的成员;
对象A拥有一个事件E : 当事件E发生的时候,对象A有能力通知别的对象 其他对象可以响应做出处理
使用:用于对象或类间的动作协调与信息传递(消息推送)
原理:事件模型中的两个“5”
发生-->响应 模型
5部分 : -------------- 闹钟响了你起床,孩子饿了你去做饭,(隐藏这订阅关系,你订阅了自己的闹钟事件,自己孩子饿了的事件)
5动作 :---------------- 1.我有一个事件 2.有人关心我的事件 3. 我的事件发生了 4.关系的对象都被通知了 5.被通知的人都对我的事件做出反应
MVC、MVP、MVVM等模式是事件模式更高级的 ;
2.事件应用
事件拥有着Event Source、
事件Event、
事件响应着、
事件处理器-------本质是个回调方法
事件订阅-------把事件处理器和事件关联在一起,本质上是一种以委托类型为基础的约定
4个event例子 VS中
一个Click事件处理可以同时处理多个button的click事件,通过sender的检测,以不同的方式进行处理;
private void Button_Click(object sender, RoutedEventArgs e)
{
if (sender==btnHello)
{
this.textBoxShowTime.Text = "HelloWorld";
}
if(sender==btnNice)
{
this.textBoxShowTime.Text = "Nice";
}
}
有几种关联事件的方法:
timer.Tick += Timer_Tick; // 直接写方法
this.btnHello.Click += new System.Windows.RoutedEventHandler(this.Button_Click); // 系统自动的委托方法
this.btnHaha.Click += (sender, e) =>
{
this.textBoxShowTime.Text = "HaHa";
}; // lambda表达式

一个事件处理器可以处理多个事件;
一个事件可以被多个事件处理器关联;
3.事件的声明
---------------------------------------------------------------------------------------
完整声明
private OrderEventHandler orderEventHandler;
public event OrderEventHandler Order //完整事件声明
{
add
{
this.orderEventHandler += value;
}
remove
{
this.orderEventHandler -= value;
}
}
----------------------------------------------------------------------------------------------
public event OrderEventHandler Order; //简化声明
public event EventHandler Order;

事件不能和委托字段混淆,虽然是前面加了个event;
事件的本质 :委托字段的包装器
对委托字段的访问起限制作用;
事件 对外界隐藏 了委托实例的大部分功能, 仅暴露添加/移除事件处理器的功能
用于声明事件的委托类型的命名约定
****用于声明Foo事件的委托,一般为 Foo EventHandler
**** FooEventHandler委托的参数一般两个
第一个是object类型,名字为sender,实际上是事件的拥有者,source;
第二个是EventArgs类的派生类,一般为 Foo EventArgs ,参数名为e;
可以把委托的参数列表看作是事件发生后发给其他响应者的“事件消息”;
****触发Foo事件的方法一般为OnFoo;
访问级别为protected
事件的命名约定
带有时态的动词或动词短语;
正在做,进行时; 做完了,完成时;
4.事件与委托的关系
事件是“以特殊方式声明的委托字段”吗? 错!只是声明时看着像
事件声明的时候使用了委托类型,简化声明会看起来像一个委托的字段;
如 public event EventHandler Order;
-----------------------------------------------------------------------------------------
要清楚事件的本质;
为什么要使用委托类型声明事件?
***对于source,为了表明source能对外传递消息
***对于subscribe,一种约定,为了约束用什么样的签名方法来处理事件
***委托类型的实例将用于存储(引用)事件处理器(方法)
对比事件和属性
属性不是字段,是字段的包装器,保证字段不被滥用
事件不是委托字段,是委托字段的包装器,保证委托字段不被滥用
包装器不可能被包装


猜你喜欢

转载自blog.csdn.net/noEnoughChief/article/details/79154282