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 ...
随机推荐
- VS2017中使用C++语言编写delay函数实现延迟
秒级别的延时 //定义函数 void delay(int sec){ time_t start_time, cur_time; // 变量声明 time(&start_time); do { ...
- js 判断回文字符串
回文字符串:字符串从前往后读和从后往前读字符顺序是一致的. 判断一个字符串是不是回文字符串 function isPalindrome(str) { var str1 = str.split(''). ...
- JS-try/catch方法判断字符串是否为json格式
定义: try/catch 语句用于处理代码中可能出现的错误信息,出现异常会导致程序崩溃,而try/catch 则可以保证程序的正常运行. try { //执行代码 不报错则 正常执行 不会进入下面的 ...
- VBA 学习笔记 - 变量与常量
学习资料:https://www.yiibai.com/vba/vba_variables.html 变量和常量命名规则 必须以字母开头 不能包含空格.句点(.).感叹号(!)或字符@,&,$ ...
- MAC系统 - 基础知识
一.基础操作 设置:触控板设置 - >学习具体手势 手势:MacBook Pro手势大全必学手势触控板手势有哪些 左键,右键,滑屏,切换到应用... 一指操作: 一指敲击:鼠标左键: 一指按下: ...
- ANSYS 瞬态热分析--样件加热
目录 1. 要求 2. ANSYS有限元分析 2.1 APDL建模 1. 要求 一块0.8m*0.4m*0.2m厚的钢板,在300℃的炉子中进行加热,其材料参数如下表所示: 材料参数 序号 名称 参数 ...
- mybatis源码探索笔记-4(缓存原理)
前言 mybatis的缓存大家都知道分为一级和二级缓存,一级缓存系统默认使用,二级缓存默认开启,但具体用的时候需要我们自己手动配置.我们依旧还是先看一个demo.这儿只贴出关键代码 public in ...
- 谈一谈并查集QAQ(上)
最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...
- STM的低功耗系列
STM32L0的2个新增外设:一是集成了晶振的USB,第二高精度的12位或16位ADC: 特色外设LUART:传统的MCU当CPU睡眠,进入低功耗模式下,外设是关闭的,因为时钟是关闭的,而意法半导体的 ...
- 【PAT甲级】1003 Emergency (25 分)(SPFA,DFS)
题意:n个点,m条双向边,每条边给出通过用时,每个点给出点上的人数,给出起点终点,求不同的最短路的数量以及最短路上最多能通过多少人.(N<=500) AAAAAccepted code: #in ...