事件的本质---特殊的多路广播委托

定义事件:

事件访问修饰符一般为public 定义为公共类型可以使事件对其他类可见

事件定义中还包括委托类型,既可以是自定义委托类型也可以是EventHandler(预定义)

运用"+="运算符来订阅事件,运用"-="运算符来取消订阅事件

例:自定义委托事件

  class HelloWorld
{
//定义委托类型
public delegate void Marry(string msg);
//使用自定义委托类型定义事件
public event Marry MarryEvent;
//发出事件
public void News(string msg)
{
//判断是否绑定了事件处理方法
if(MarryEvent!=null)
{
//触发事件
MarryEvent(msg);
} }
static void Main(string[] args)
{
//初始化新郎官对象
HelloWorld helloWorld=new HelloWorld();
//实例化朋友
Friend zhangsan=new Friend("Zhangsan");
Friend lishi=new Friend("Lishi");
Friend zhaoliu=new Friend("Zhaoliu");
//订阅事件
helloWorld.MarryEvent += new Marry(zhangsan.SendMessage);
helloWorld.MarryEvent += new Marry(lishi.SendMessage);
helloWorld.MarryEvent += new Marry(zhaoliu.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.WriteLine("---------------------------------------");
//张三取消订阅
helloWorld.MarryEvent -= new Marry(zhangsan.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.ReadKey();
}
} class Friend
{
//字段
public string Name;
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合Marry委托定义
public void SendMessage(string message)
{
//输出信息
Console.WriteLine(message);
//对事件做出处理
Console.WriteLine("{0}收到了到时准时参加",Name);
} }

事件的订阅与取消

例:预定义委托事件

  class HelloWorld
{
//使用自定义委托类型定义事件
public event EventHandler MarryEvent;
//发出事件
public void News(string msg)
{
//判断是否绑定了事件处理方法
if(MarryEvent!=null)
{
Console.WriteLine(msg);
//触发事件
MarryEvent(this,new EventArgs());
} }
static void Main(string[] args)
{
//初始化新郎官对象
HelloWorld helloWorld=new HelloWorld();
//实例化朋友
Friend zhangsan=new Friend("Zhangsan");
Friend lishi=new Friend("Lishi");
Friend zhaoliu=new Friend("Zhaoliu");
//订阅事件
helloWorld.MarryEvent += new EventHandler(zhangsan.SendMessage);
helloWorld.MarryEvent += new EventHandler(lishi.SendMessage);
helloWorld.MarryEvent += new EventHandler(zhaoliu.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.WriteLine("---------------------------------------");
//张三取消订阅
helloWorld.MarryEvent -= new EventHandler(zhangsan.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.ReadKey();
}
} class Friend
{
//字段
public string Name;
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合Marry委托定义
public void SendMessage(object s,EventArgs e)
{
//对事件做出处理
Console.WriteLine("{0}收到了到时准时参加",Name);
} }

使用预定义委托事件订阅与取消

运行结果:

例:EventArgs扩展

 //自定义事件类型并使其带有事件数据
public class EventMsg : EventArgs
{
public string Msg; public EventMsg(string msg)
{
Msg = msg;
}
} class HelloWorld
{
//使用自定义委托类型定义事件
public event EventHandler MarryEvent;
//发出事件
public void News(string msg)
{ //判断是否绑定了事件处理方法
if(MarryEvent!=null)
{
//触发事件
MarryEvent(this, new EventMsg(msg));
} }
static void Main(string[] args)
{
//初始化新郎官对象
HelloWorld helloWorld=new HelloWorld();
//实例化朋友
Friend zhangsan=new Friend("Zhangsan");
Friend lishi=new Friend("Lishi");
Friend zhaoliu=new Friend("Zhaoliu");
//订阅事件
helloWorld.MarryEvent += new EventHandler(zhangsan.SendMessage);
helloWorld.MarryEvent += new EventHandler(lishi.SendMessage);
helloWorld.MarryEvent += new EventHandler(zhaoliu.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.WriteLine("---------------------------------------");
//张三取消订阅
helloWorld.MarryEvent -= new EventHandler(zhangsan.SendMessage);
//发出通知
helloWorld.News("他要结婚了,到时来");
Console.ReadKey();
}
} class Friend
{
//字段
public string Name;
public Friend(string name)
{
Name = name;
}
//事件处理函数,该函数需要符合Marry委托定义
public void SendMessage(object s,EventArgs e)
{
//对事件做出处理
Console.WriteLine("{0}收到了到时准时参加",Name);
} }

EventArgs扩展

在VS中可以用F12查看EventHandler的定义

public delegate void EventHandler(object sender, EventArgs e);

(1)该委托返回类型是void因此实例化委托类型的方法也要满足这点

(2)第一个参数sender负责保存对触发事件对象的引用,其类型为object

(3)第二个参数e保存事件数据,EventArgs类也是.NET类库中定义的类,它不保存任何火数据

C# 特性之事件的更多相关文章

  1. JS 事件代理

    事件处理器:onclick.onmouseover.... 在传统的事件处理中,你需要为每一个元素添加或者是删除事件处理器.然而,事件处理器将有可能导致内存泄露或者是性能下降——你用得越多这种风险就越 ...

  2. JS事件冒泡

    JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这 一过程被 ...

  3. 《JS高程》事件学习笔记

    事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...

  4. JS 阻止浏览器默认行为和冒泡事件

    JS 冒泡事件   首先讲解一下js中preventDefault和stopPropagation两个方法的区别: preventDefault方法的起什么作用呢?我们知道比如<a href=& ...

  5. JavaScript的事件代理(转)

    如果你想给网页添加点JavaScript的交互性,也许你已经听过JavaScript的事件代理(event delegation),并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么 ...

  6. Jquery 页面元素动态添加后绑定事件丢失方法,非 live

    代码1: 以此方法绑定的input框事件,在通过add按钮后用jquery绑定的事件 alert就会丢失 <input type="button" value="A ...

  7. 微软公有云事件中心(Azure Event Hubs)在开放物联网大会(OIOT)啼声初试

     发布于 2014-12-29 作者 刘 天栋 2014年12月18日,InfoQ在京召开开放物联网大会(Open IOT Conference),微软开放技术(中国)资深项目经理陈岭在大会中针对 ...

  8. js事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象

    事件对象    在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含着所有与事件有关的信息.包括导致事件的元素.事件的类型,以及其他与特定事件相关的信息.例如,鼠标操作导致的事件对 ...

  9. JS冒泡事件与处理

    JavaSciprt事件中有两个很重要的特性:事件冒泡以及目标元素. 事件冒泡: 当一个元素上的事件被触发的时候,比如说鼠标点击了一个按钮,同样的事件将会在那个元素的所有祖先元素中被触发.这 一过程被 ...

随机推荐

  1. .net2.0 C# Json反序列化

    http://cjl20082002.blog.163.com/blog/static/120827332009511103457637/ 去:http://json.codeplex.com/下载  ...

  2. mac安装python3

    http://www.jianshu.com/p/51811fa24752 brew install python3 安装路径:/usr/local/Cellar 使用: 执行python3即可 配置 ...

  3. html5--3.15 textarea元素

    html5--3.15 textarea元素 学习要点 掌握textarea元素的使用 textarea元素 用来建立多行输入文本框 元素标签中的内容将一文本框默认值的形式呈现 不仅可以用在表单中,也 ...

  4. (QACNN)自然语言处理:智能问答 IBM 保险QA QACNN 实现笔记

    follow: https://github.com/white127/insuranceQA-cnn-lstm http://www.52nlp.cn/qa%E9%97%AE%E7%AD%94%E7 ...

  5. C语言文件读写总结

    主要有四种: 1.文件的字符输入输出函数 fgetc fputc2.文件的字符串输入输出函数 fgets fputs3.文件的格式化输入输出函数 fscanf fprintf4.文件的数据块输入输出函 ...

  6. XAMPP的端口被占用

    打开xampp\apache\conf\httpd.conf文件把80端口修改为:8081;打开xampp\apache\conf\extre\httpd-ssl.conf文件把443修改为4433或 ...

  7. NLTK vs SKLearn vs Gensim vs TextBlob vs spaCy

    Generally, NLTK is used primarily for general NLP tasks (tokenization, POS tagging, parsing, etc.) S ...

  8. OpenService 打开一个已经存在的服务

    SC_HANDLE WINAPI OpenService( _In_ SC_HANDLE hSCManager, _In_ LPCTSTR lpServiceName, _In_ DWORD dwDe ...

  9. ubuntu--vim 技巧

    本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了! vi编辑器是所有Unix及Linux系统下标准的编 辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法 ...

  10. You Are the One

    题意: 有n个人排队,第i个入场的人x的不愉快度是$D_x*(i-1)$,现在给你n个人在队伍中的位置, 你可以用一个栈让一个人后面的人先进入,问最小的不愉快度是多少. 解法: 考虑注意到用栈调整次序 ...