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

定义事件:

事件访问修饰符一般为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. 【Windows核心编程】一个使用内存映射文件进行进程间通信的例子

    进程间通信的方式有很多种,其底层原理使用的都是内存映射文件. 本文实现了Windows核心编程第五版475页上的demo,即使用内存映射文件来在进程间通信. 进程1 按钮[Create  mappin ...

  2. android中getWidth()和getMeasuredWidth()

    getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小.getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原 ...

  3. ThinkPHP RBAC权限管理机制

    RBAC是ThinkPHP很好用的后台权限管理的,话不多说,实现方法如下,也方便以后自己查询使用: 1.新建4个数据库表 self_role权限表 CREATE TABLE `self_role` ( ...

  4. c++变量定义

    float **a 表示a是一个“指针的指针”,也可以理解为是一个二维数组的指针,***a具有类似的解释,可以理解为是一个三维数组的指针.

  5. 【MongoDB学习-在.NET中的简单操作类】

    1.新建MVC项目, 管理NuGet包,进入下载MongDB.net库文件 2.新增项目DAL数据访问层,引用以下库文件: 3.C# 访问MongoDB通用方法类: using MongoDB.Dri ...

  6. !function(){}()和function(){}()区别

    控制台打印结果如下所示,接下来看一下具体运行,参考https://swordair.com/function-and-exclamation-mark/: 让一个函数声明语句变成了一个表达式

  7. Opencv— — image offset

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  8. Android-Styles and Themes [From API Guide]

    This blog was opened 5 months ago and it has 57 posts now,but the poor thing is by now no one has co ...

  9. POJ1236 Network of Schools (强连通分量,注意边界)

    A number of schools are connected to a computer network. Agreements have been developed among those ...

  10. SimpliciTI Sample Applications

    Sample Applications 介绍了4个简单的示例应用程序来演示SimpliciTI的各种特性和功能. Simple Peer-To-Peer :two linked End-Devices ...