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. 5 asyncio 梨视频

    # 如何提升requests模块爬取数据的效率?- 多进程或多线程(不建议) 太耗费资源- 线程池或进程池(适当使用) - 单线程 + 异步协程(推荐) # 线程池使用案例 # 梨视频 下载作业 im ...

  2. pikachu-xx型注入

    一 xx型注入,一脸懵x,管他什么型注入,先在输入框里随便输入个字符a试试 我们可以发现该传输方式为get型传输,传输的参数为name=a&submit=查询 二 测试使其闭合的符号 加一个单 ...

  3. C:变量的声明与定义

    声明变量不需要建立存储空间,如:extern int a; 定义变量需要建立存储空间,如:int b; #include <stdio.h> int main() { //extern 关 ...

  4. Codeforce 977E Cyclic Components

    dfs判断图的连通块数量~ #include<cstdio> #include<algorithm> #include<vector> #include<cs ...

  5. Cisco无线mDNS

    1.mDNS介绍 两个协议:mDNS和Bonjour mDNS: mDNS(Multicast DNS):主要实现了在没有传统DNS Server的情况下使用LAN内的主机实现相互发现和通信. 使用U ...

  6. ANSYS单元应用简介1

    目录 1. LINK单元 2. BEAM单元 3. PLANE单元 4. SHELL单元 5. SOLIDE单元 6. COMBIN单元 ANSYS中的单元针对不同的应用对象,有着不同的选择方法,下面 ...

  7. java代码开启关闭线程(nginx)

    源码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; pub ...

  8. python2.7 一个莫名其妙的错误

    先看看错误: Traceback (most recent call last): File "/home/darkchii/文档/PycharmProjects/ml/model.py&q ...

  9. 利用DFS算出有多少个连通图

    以下面一个题目为例,[题目链接]: https://www.luogu.com.cn/problem/P4961 题目中涉及求出八联通图的个数,这里给出这步的代码: memset(vis, 0, si ...

  10. gitlab的搭建与使用(一)

    yum install curl policycoreutils openssh-server openssh-clients postfix -y systemctl enable sshd sys ...