1.什么是事件,使对象或者类具有通知功能的成员。//为了解决字段在外部被滥用,推出了事件

事件的功能能=通知+可选的事件参数(具体的详细信息,包括谁发送了消息,发送的什么消息)

使用:用于对象或者类件的动作协调与信息传递(消息推送)

事件模型(发生,响应模型),事件是工具,不会主动通知别人,被事件的拥有者的内部逻辑触发。

2.事件模型中的5个部分:

  • 事件的拥有者:对象
  • 事件的成员:event成员
  • 事件的响应者:对象
  • 事件处理器:本质上是一个回调方法(方法成员)
  • 事件订阅:把事件处理器与事件关联在一起,本质上事一种委托类型为基础的“约定”

注意:事件不是委托类型的字段,因为如果是的话,就会不安全。不安全表现在,如果事件真的成为了委托类型的字段,那么,字段既可以存在于+=运算符的左边,还可以存在于.操作符的左侧,这时就能调用Invoke(其他实例,事件消息)方法来触发事件,触发事件的方法一定不能被外部访问到。

  • 一个事件可以挂接多个事件处理器
  • 一个事件处理器可以被多个事件挂接
  class Program
{
static void Main(string[] args)
{
Customer customer = new Customer();//事件的拥有者
Waiter waiter=new Waiter();//响应者
customer.Order += waiter.Action;//事件处理器Waiter.Action,+=是事件的订阅。为类的事件成员挂接事件处理器,或者挂接(一个委托类型的实例:如new EventHnadler(waiter,Action))//这样看起来像是委托类型的实例去添加方法的引用一样,这样更像是order是委托类型的实例
customer.Action();//事件的触发必须由事件的拥有者来做         
customer.PayTheBill();
Console.ReadLine(); }
}
public delegate void OrderEventHandler(Customer customer, OrderEventArgs e);//void是事件处理器也就是方法的返回值类型,EventHandler后缀存在的意义 1.立刻知道这个委托是用来声明事件的 2.表明是用来约束事件处理器的 3.这个委托将来创建的实例是为了存储事件处理器的
public class OrderEventArgs : EventArgs//传递事件信息的类EventArgs
{
public string DishName { get; set; }
public string Size { get; set; }
}
public class Customer
{
public double Bill { get; set; }
public void PayTheBill()
{
Console.WriteLine("I will pay{0}",this.Bill);
}
//事件需要委托来约束,规定了事件能发送什么样的消息给事件接收者,规定了事件接受者能收到什么样的消息,事件接受者的事件处理器必须能和事件匹配
//当事件的响应者向事件的拥有者提供了能够匹配这个事件的事件处理器后,保存事件处理器,引用事件处理器就必须用委托
//private OrderEventHandler orderEventHandler;//这个委托字段是用来存储,引用个事件处理的 //public event OrderEventHandler Order //用上面那个委托类型来约束事件,声明事件
//{
// add { this.orderEventHandler += value; }//事件处理器的添加器,value是外界传进来eventhandler
// remove { this.orderEventHandler -= value; }
//}//声明事件的代码 public event OrderEventHandler Order;//声明了一个事件,能够让对象之间的关系更加有道理,看起来像是在声明一个字段,重点是Event
public void Walkin()
{
Console.WriteLine("Walk into the restaurant");
}
public void SitDown()
{
Console.WriteLine("sit Down");
} public void Think()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Let me think");
Thread.Sleep(1000);
}
this.OnOrder("宫保鸡丁", "large");
}
protected void OnOrder(string dishName,string size)//事出有因,因为调用了OnOrder这个方法,所以Order这个事件触发了,并且public这个方法不能被外界触发
{
if (this.Order != null)//餐馆很忙,没有事件处理器也就是waiter来响应你的事件
{
OrderEventArgs e = new OrderEventArgs();//事件消息
e.DishName = dishName;
e.Size = size;
this.Order.Invoke(this, e);//此处传入的参数是在委托中定义好的,触发事件的动作
}
}
public void Action()
{
Console.ReadLine();
this.Walkin();
this.SitDown();
this.Think();
} }
public class Waiter
{ public void Action(Customer customer, OrderEventArgs e)//第一个参数这个事件的拥有者是Customer触发的,第二个参数是EventArgs的派生类,这个事件里面是什么内容,关于事件的数据
{ Customer customer1 = customer as Customer;
OrderEventArgs order = e as OrderEventArgs;
Console.WriteLine("I will server you the dish-{0}", e.DishName);
double price = 10;
switch (e.Size)
{
case "small":
price=price *0.5;
break;
case "large":
price=price*1.5;
break;
default:
break; }
customer.Bill += price;
}
}

c# 事件3的更多相关文章

  1. JNI详解---从不懂到理解

    转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...

  2. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  3. 关于 Chrome 浏览器中 onresize 事件的 Bug

    我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...

  4. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  5. C++中的事件分发

    本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...

  6. 移动端IOS点击事件失效解决方案

    解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...

  7. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

  8. HTML 事件(一) 事件的介绍

    本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...

  9. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  10. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

随机推荐

  1. Vue中修改组件默认样式

    vue 中直接使用 class 修改组件的默认样式,在使用 scoped 之后,样式是没有效果. 此时可以使用div 包裹组件,deep 可以实现修改组件样式 .lxfix /deep/ .contr ...

  2. 「JSOI2013」旅行时的困惑

    「JSOI2013」旅行时的困惑 传送门 由于我们的图不仅是一个 \(\text{DAG}\) 而且在形态上还是一棵树,也就是说我们为了实现节点之间互相可达,就必须把每条边都覆盖一次,因为两个点之间的 ...

  3. Flask - g变量

    传送门 http://flask.pocoo.org/docs/1.0/appcontext/#storing-data http://flask.pocoo.org/docs/1.0/appcont ...

  4. cmd创建用户开启3389命令

    1.创建用户chen Net user chen 1234566 /add 2.将用户chen添加到管理员组 net localgroup Administrators chen /add 3.开启3 ...

  5. 关于无线的Idle Timeout和Session Timeout

    1.Session Timeout Session Timer的默认值为1800s,也就是30min.Session Timeout:当该计时器超时时,使得客户端强制发生重认证,这个时间是从客户端认证 ...

  6. Nexus-配置vPC 实验一

    配置vPC的步骤:1.配置vPC domain2.配置vPC之间的keepalive link3.配置vPC之间的peer link4.配置vPCs5.确认双方配置一致 拓扑及描述:DC1-N7K-5 ...

  7. Fiddler一次性发多个请求

    Fiddler一次发送多个请求 选中某个请求: 选中 : Raw, 将request数据拷出: 包含请求header和request body 替换request header里面的ASP.NET_S ...

  8. RFID学习

    RFID:射频识别卡有读卡器和电子标签(有源/无源/半有源)组成,工作频率有LF/HF/UHF/MF,低频的通讯距离近(1m)常用来做门禁:高频的通讯距离远可以批量读取. 无源的轻巧/防拆一致性好,在 ...

  9. stm32CubeMx lwip + freeRTOS

    MCU: STM32F429IGT6 工具:STM32CubeMx  版本号 5.0.0 Keil uVersion5 目的:使用LWIP 实现简单的网络连通 一  简介 LWIP(Light Wei ...

  10. 【JavaWeb】导入Excel并进行校验

    一.需要实现的目标 1.界面编写 2.导入表读取表名,进行校验,后台匹配(判断此表的名称是否能够模糊匹配上) 3.确定表存在,读取其中的数据,暂存 4.正则表达式数据校验(判断是否已存在,数据是否符合 ...