C# event 事件学习
C# event 事件学习
运行环境:Window7 64bit,.NetFramework4.61,C# 6.0; 编者:乌龙哈里 2017-02-26
章节:
- 简单事件编写
- 模拟 WPF 控件传递消息
正文:
一、简单事件编写:
对于 C# 中的事件 event ,我的理解是:通过委托(delegate)来调用另一个类的 method。
比如下面有个电台的类:
class Station
{
private string info;
public Station(string s)=>info=s;
public void Broadcast()=> Console.WriteLine(info);
}
现在手头上我有个 Radio 的类,我怎么直接调用 Station.Broadcast() 呢?
方法一,可以用反射(Reflaction),但是这样太笨重了。
方法二,在 Radio 类中直接写 Station 的实例,比如 station1.Broadcast() ,但这样的设计很不灵活,万一碰到另外一个实例名叫 station2 的就歇菜了。
这时候就需要事件(event)了。下来我们就按步骤一步一步来建立一个 Radio 的类:
1、声明一个委托 delegate 指向想调用的方法。
这里是 Broadcast()。写委托的时候注意参数必须和要调用的方法类型一致。
public delegate void StationBroadcast();
2、用关键字 event 声明这个委托的事件。
public event StationBroadcast PlayEvent;
3、写一个方法来调用这个事件。
public void OnPlay()
{
PlayEvent();
Console.WriteLine();
}
好了,到这步为止,我们就设好一个能调用 Station.Broadcast() 的类 Radio。下面是整个 Radio 类的写法:
class Radio
{
public delegate void StationBroadcast();
public event StationBroadcast PlayEvent;
public void OnPlay()
{
PlayEvent();
Console.WriteLine();
}
}
下来就是如何运用了。Radio 的 PlayEvent 要加载和弃掉事件,用符号 +=,-=。
示例1:
Station fm101 = new Station("fm101 is on air ~~");
Station fm97 = new Station("~~ here is fm97");
Radio radio = new Radio();
//只加载fm101
radio.PlayEvent += fm101.Broadcast;
radio.OnPlay();
//只加载fm97
radio.PlayEvent -= fm101.Broadcast;
radio.PlayEvent += fm97.Broadcast;
radio.OnPlay();
//增加一个 fm101
radio.PlayEvent+=fm101.Broadcast;
radio.OnPlay();
//多加载一次fm101
radio.PlayEvent += fm101.Broadcast;
radio.OnPlay();
/*运行结果:
fm101 is on air ~~
~~ here is fm97
~~ here is fm97
fm101 is on air ~~
~~ here is fm97
fm101 is on air ~~
fm101 is on air ~~
*/
这样写,只要符合返回值为 void 的,不带参数的函数,不管叫什么名字,我们都可以调用。
比如我们这个 Radio 更高级些,还能放MP3,增加一个 MP3的类:
class MP3
{
public void Play() => Console.WriteLine("yoyo !");
}
下来我们一样调用:
MP3 mp3 = new MP3();
radio.PlayEvent += mp3.Play;
radio.OnPlay();
/*运行结果:
yoyo !
*/
二、模拟 WPF 控件传递消息:
在写 Wpf 程序的时候,Button 的响应 Click 事件一般如下:
private void Button_Click(object sender, RoutedEventArgs e);
下来我们就模拟一下这个响应的过程。以下程序都是控制台应用,并不是 Wpf 应用。
首先有个消息类供控件来传递:
class MsgArgs
{
public string str;
}
接下来 模拟窗口类 Win 里面有控件 Button,还有发生按钮 click 改变消息 MsgArgs 内容的方法:
class Win
{
public Button button1;
public void OnClick(object sender,MsgArgs e)
{
e.str = "button click";
}
}
然后根据上面所说的步骤,建立一个 Button 类:
class Button
{
public delegate void OnClickHandler(object o,MsgArgs e);
public event OnClickHandler OnClick;
public void Click(object sender,MsgArgs e)
{
OnClick(sender,e);
Console.WriteLine(e.str);
}
}
接下来就是具体调用了,如下:
Win win = new Win();
Button btn = new Button();
MsgArgs msg = new MsgArgs();
win.button1 = btn;
btn.OnClick += win.OnClick;
btn.Click(btn, msg);
模拟完毕,简单再现了 Wpf 应用中的控件消息传递。
C# event 事件学习的更多相关文章
- event事件学习小节
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS学习笔记9之event事件及其他事件
-->鼠标事件-->event事件对象-->默认事件-->键盘事件(keyCode)-->拖拽效果 一.鼠标事件 onclick ---------------鼠标点击事 ...
- JavaScript学习 - 基础(七) - DOM event(事件)
DOM event(事件) 定义事件: // 定义事件: //方式一,直接在标签上定义事件 // 方式二: var a11 = document.getElementsByName('a11')[0] ...
- Mysql事件学习
出自:http://blog.chinaunix.net/uid-20639775-id-3323098.html Mysql事件学习 在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQ ...
- 简单总结焦点事件、Event事件对象、冒泡事件
每学习一些新的东西,要学会复习,总结和记录. 今天来简单总结一下学到的几个事件:焦点事件.Event事件对象.冒泡事件 其实这几个事件应该往深的说是挺难的,但今天主要是以一个小菜的角度去尝试理解一些基 ...
- C#委托与事件学习笔记
委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...
- Mysql event事件用法
公司的数据库需要进行定期删除数据,需要用到mysql event事件,学习和梳理这块知识. 1查看event是否开启 SHOW VARIABLES LIKE 'event_scheduler'; 2开 ...
- CDI(Weld)高级<4> Event(事件) (转)
目录[-] 1. Event payload(事件的有效载入) 2. Event observers(event的观察者) 3. Event producers(event生产者) 4.Annotat ...
- Caddy源码阅读(二)启动流程与 Event 事件通知
Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy C ...
随机推荐
- daemon Thread
1.概念 守护进程(daemon)是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控.此类程序会被以进程的形式初始化.守护进程程序的名称通常以字母“d”结尾:例如, ...
- BZOJ2160 拉拉队排练【Manacher】
Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...
- Codeforces 815C. Karen and Supermarket【树形DP】
LINK 思路 首先发现依赖关系是一个树形的结构 然后因为直接算花多少钱来统计贡献不是很好 因为数组开不下 那就可以算一个子树里面选多少个的最小代价就可以了 注意统计贡献的时候用优惠券的答案只能在1号 ...
- vmware linux nat模式设置静态ip
网上资料很多,但是都不怎么实用,这里给大家总结一下.nat模式上网.因为nat本身就能上网为什么还要设置ip.这有点自找麻烦.但是在集群这是必须的.要么你搭建伪分布,要么至少具有三台物理机器.为了节省 ...
- C#通过StreamWriter对象实现把数值内容写到记事本
本文介绍下,用C#实现将数组内容写到txt文件中的一例代码,有需要的朋友,参考下吧. 代码示例:StreamWriter sw=new StreamWriter("F:\\ex.txt&qu ...
- 异常处理—Exception(二)
在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...
- C#.NET抽象类和接口的区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况.不能创建abstract 类的实例.然 ...
- cocos2dx调度器(scheduler)
调度器(scheduler) http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/m ...
- oracle之 利用 controlfile trace文件重建控制文件
一. 11g RAC 重建控制文件 1. --"create controlfile"命令生成到追踪文件中:alter database backup controlfile to ...
- linux中sar的详细使用
在使用UNIX操作系统的过程中,我们常常会用到各种各样的问题,比如系统运行速度突然变慢,系统容易死机或者主机所带的终端常出现死机,这时我们常常猜测,是硬盘空间太小,还是内存不足?I/O出现瓶颈,或者是 ...