c# 事件3
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的更多相关文章
- JNI详解---从不懂到理解
转载:https://blog.csdn.net/hui12581/article/details/44832651 Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 C ...
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- C++中的事件分发
本文意在展现一个C++实现的通用事件分发系统,能够灵活的处理各种事件.对于事件处理函数的注册,希望既能注册到普通函数,注册到事件处理类,也能注册到任意类的成员函数.这样在游戏客户端的逻辑处理中,可以非 ...
- 移动端IOS点击事件失效解决方案
解决方案 解决办法有 4 种可供选择: 1 将 click 事件直接绑定到目标元素(即 .target)上 2 将目标元素换成 <a> 或者 button 等可点击的元素 3 将 clic ...
- Android笔记——Button点击事件几种写法
Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...
- HTML 事件(一) 事件的介绍
本篇主要介绍HTML中的事件知识:事件相关术语.DOM事件规范.事件对象. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三 ...
- HTML 事件(二) 事件的注册与注销
本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
随机推荐
- linux chrome rpm chrome浏览器下载(ver 63-70)
我的github chrome下载地址:https://github.com/chen1932390299/python 国内开源的资源 chrome下载centos 的:https://www.ch ...
- 使用SQL计算宝宝每次吃奶的时间间隔(数据保障篇)
目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿^_^)需求,具体可参考: 使用SQL计算宝宝每次吃奶的时间间隔 使用SQL计算宝宝每次吃奶的时间间隔(续) 那么本篇 使用SQL计算 ...
- chkconfig 原理 (企业应用)
企业应用:如何让某个服务开机自启动 chkconfig --level 345 serviceName on chkconfig --level 345 serviceName off chkconf ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 算术函数
NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide(). 需要注意的是数组必须具有相同的形状或符合数组广播规则. import nump ...
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用指数衰减的学习率
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_NODE = 784 ...
- 关于java继承条件下的构造方法调用
首先是测试代码: class Grandparent { public Grandparent() { System.out.println("GrandParent Created.&qu ...
- 安装PHP解析环境!
较新版本(如5.6)的PHP已经自带FPM(fastCGI process manager,FastCGI进程管理器)模块,用来对PHP解析实例进行管理,优化解析效率,因此在配置PHP编译选项时应添加 ...
- 对RoboMaster论坛自动签到脚本制作(虽然没什么用)
RoboMaster论坛自动签到,自动浏览刷分 不务正业系列 上完最后一节课,队长跟我们说,RM有个BBS,可以看看,但是下载要金币,这个金币只能做签到等事情才能得到,所以我用python做了一个小程 ...
- TCP通讯代码
服务端代码: import socket server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 使用固定端口 server_ ...
- Redis实战(20)Redis 如何从海量数据中查询出某一个 Key?
序言 资料 https://www.cnblogs.com/vipstone/p/12373734.html