事件(event):

1.       事件是类在发生其关注的事情时用来提供通知的方式。例如,封装用户界面控件的类可以定义一个在单击该控件时发生的事件。控件类不关心单击按钮时发生了什么,但它需要告知派生类单击事件已发生。然后,派生类可选择如何响应。

2.       事件发行者(Publisher):

一个事件发行者,也称作发送者(sender),其实就是一个对象,这个对象会自行维护本身的状态信息。当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者。

事件订阅者(Subscriber):

对事件感兴趣的对象,也称为接收者(Receiver),可以注册感兴趣的事件,通常需提供一个事件处理程序,在事件发行者触发一个事件后,会自动执行这段代码的内容。

3. 事件的四个步骤:

->①在事件发行者中定义一个事件

->②在事件发行者中触发事件

->③在事件订阅者中定义事件处理程序

->④向事件发行者订阅一个事件

看一段代码:

using System;

//注意下面的四步骤!!!

//事件订阅者

class Subscriber   //订阅者

{

private string name;

public Subscriber(string name)

{

this.name = name;

}

//③在事件订阅者中定义事件处理程序

public void Receive(string manazineName) //***在事件订阅中定义事件处理程序

{

Console.WriteLine(name + "订阅已收到" + manazineName);

}

}

//事件发布者

class Publisher    //出版社

{

public delegate void PubComputer(string magazineName);   //声明事件所需的代理,也就是一委托类型

public delegate void PubLife(string magazineName);

//①在事件发行者中定义一个事件

public event PubComputer OnPubComputer;   //事件的声明,也就是定义一个委托类型变量

public event PubLife OnPubLife;

public void issueComputer()              //***触发事件的方法

{

if (OnPubComputer != null)

{

Console.WriteLine("发行<<电脑>>杂志");

//②在事件发行者中触发事件

OnPubComputer("电脑杂志");       //***触发一个委托链

}

}

public void issueLife()

{

if (OnPubLife != null)

{

Console.WriteLine("发行<<生活>>杂志");

//②在事件发行者中触发事件

OnPubLife("生活杂志");

}

}

}

class Story

{

static void Main()

{

Publisher Pub = new Publisher();

Subscriber zs = new Subscriber("张三");

Subscriber ls = new Subscriber("李四");

//④向事件发行者订阅一个事件

Pub.OnPubComputer += zs.Receive;          //***向事件发行者订阅一个事件

Pub.OnPubComputer += ls.Receive;

Pub.OnPubLife += ls.Receive ;

Pub.issueComputer();   //触发事件

Pub.issueLife();

Console.WriteLine();

Console.WriteLine("a year after");

Pub.OnPubComputer -= ls.Receive;

Pub.issueComputer();   //触发事件

Pub.issueLife();

Console.ReadLine();

}

}

4.       NET Framework事件设计准则:

->事件的命名准则应使用PascalCasing命名方式

->声明delegate时,使用void类型当作返回值,EventName事件的事件委托是EventNameEventHandler,事件接受两个传入参数,一律命为sender与e.

->定义一个提供事件数据的类。对类以EventNameEventArgs进行命名,从System.EventArgs派生该类,然后添加所有事件特定的成员。

public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);

->下面的过程说明如何在类中实现事件。如果事件不提供任何数据,也要声明两参数,e参数可以直接使用系统的System.EventArgs类。 如果需要传递数据,则要从System.EventArgs继承一个类, 并把数据放在里面。

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

public event EventNameEventHandler EventName;

->在引发事件的类中提供一个受保护的方法。以OnEventName进行命名。在该方法中引发该事件:

protected virtual void OnEventName(EventArgs e)

{

If ( EventName != null )

{

EventName(this, e );

}

下面规范化一下上面的代码:

using System;

//注意下面的四步骤!!!

//事件订阅者

class Subscriber   //订阅者

{

private string name;

public Subscriber(string name)

{

this.name = name;

}

//③在事件订阅者中定义事件处理程序

public void Receive(object sender,PubEventArgs e) //***在事件订阅中定义事件处理程序

{

Console.WriteLine(e.pubDate +" " +name+ "订阅已收到" + e.magazineName );

}

}

//事件发布者

class PubEventArgs : EventArgs    //提供数据的类

{

private readonly string _magazineName;

private readonly DateTime _pubDate;

public PubEventArgs(string magazineName, DateTime pubDate)

{

_magazineName = magazineName;

_pubDate = pubDate;

}

public string magazineName

{

get { return _magazineName; }

}

public DateTime pubDate

{

get { return _pubDate; }

}

}

class Publisher    //出版社

{

public delegate void PubComputerEventHandler(object sender,PubEventArgs e);   //声明事件所需的代理,也就是一委托类型

public delegate void PubLifeEventHandler(object sender, PubEventArgs e);

//①在事件发行者中定义一个事件

public event PubComputerEventHandler PubComputer;   //事件的声明,也就是定义一个委托类型变量

public event PubLifeEventHandler PubLife;

protected virtual void OnPubComputer(PubEventArgs e)

{

PubComputerEventHandler handler = PubComputer;

if (handler != null)

{

handler(this, e);

}

}

protected virtual void OnPubLife(PubEventArgs e)

{

PubLifeEventHandler handler = PubLife;

if (handler != null)

{

handler(this, e);

}

}

public void issueComputer(string magazineName, DateTime pubDate)              //***触发事件的方法

{

Console.WriteLine("发行" + magazineName);

//②在事件发行者中触发事件

OnPubComputer(new PubEventArgs(magazineName, pubDate));

}

public void issueLife(string magazineName, DateTime pubDate)              //***触发事件的方法

{

Console.WriteLine("发行" + magazineName);

//②在事件发行者中触发事件

OnPubLife(new PubEventArgs(magazineName, pubDate));

}

}

class Story

{

static void Main()

{

Publisher Pub = new Publisher();

Subscriber zs = new Subscriber("张三");

Subscriber ls = new Subscriber("李四");

//④向事件发行者订阅一个事件

Pub.PubComputer += zs.Receive;          //***向事件发行者订阅一个事件

Pub.PubComputer += ls.Receive;

Pub.PubLife += ls.Receive;

Pub.issueComputer("电脑杂志",Convert.ToDateTime ("2006-1-1"));   //触发事件

Pub.issueLife("生活杂志", Convert.ToDateTime("2006-1-1"));

Console.WriteLine();

Console.WriteLine("a year after");

Pub.PubComputer -= ls.Receive;

Pub.issueComputer("电脑杂志", Convert.ToDateTime("2007-1-1"));   //触发事件

Pub.issueLife("生活杂志", Convert.ToDateTime("2007-1-1"));

Console.ReadLine();

}

}

事件[event]_C#的更多相关文章

  1. 事件EVENT与waitforsingleobject的使用

    事件event与waitforsingleobject的配合使用,能够解决很多同步问题,也可以在数据达到某个状态时启动另一个线程的执行,如报警. event的几个函数: 1.CreateEvent和O ...

  2. 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...

  3. C#事件(event)解析

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...

  4. 【温故知新】c#事件event

    从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以 ...

  5. C#中的委托(Delegate)和事件(Event)

    原文地址:C#中的委托(Delegate)和事件(Event) 作者:jiyuan51 把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写的设计模式--观察者(Obs ...

  6. MFC线程(三):线程同步事件(event)与互斥(mutex)

    前面讲了临界区可以用来达到线程同步.而事件(event)与互斥(mutex)也同样可以做到. Win32 API中的线程事件 HANDLE hEvent = NULL; void MainTestFu ...

  7. 重温委托(delegate)和事件(event)

    1.delegate是什么 某种意义上来讲,你可以把delegate理解成C语言中的函数指针,它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m,说白了就是可以把方法当作 ...

  8. C#总结(二)事件Event 介绍总结

    最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西.前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event). 事件(event),对于 ...

  9. 多线程面试题系列(6):经典线程同步 事件Event

    上一篇中使用关键段来解决经典的多线程同步互斥问题,由于关键段的"线程所有权"特性所以关键段只能用于线程的互斥而不能用于同步.本篇介绍用事件Event来尝试解决这个线程同步问题.首先 ...

随机推荐

  1. Middleware课程01-概述

    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源.中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯.是连接两个独立应用程序或独立系统的软件.相 ...

  2. Codeforces Round #333 (Div. 2) B. Approximating a Constant Range st 二分

    B. Approximating a Constant Range Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com ...

  3. C# 强制关闭当前程序进程(完全Kill掉不留痕迹)

    C# 强制关闭当前程序进程(完全Kill掉不留痕迹) /// <summary> /// 运行DOS命令 /// DOS关闭进程命令(ntsd -c q -p PID )PID为进程的ID ...

  4. makefile中的patsubst

    函数名称:加前缀函数—addprefix. 函数功能:为“NAMES…”中的每个文件名称加入前缀“PREFIX”.參数“NAMES…”是空格切割的文件名称序列,将“SUFFIX”加入到此序列的每个文件 ...

  5. Scrapy 对不同的Item进行分开存储

    在Piperlines里面进行对象的判断, def process_item(self, item, spider): if item.__class__ == BaseItem : #savexxx ...

  6. Nginx Rewrite 实现匹配泛域名规则

    Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru ...

  7. Ruby on Rails Tutorial 第一章 之 Heroku部署

    1.目的:用Heroku将开发环境部署到生产环境中.Heroku专门用于部署Rails和其他Web应用,部署Rails应用的过程非常简单——只要源码纳入Git版本控制系统就好. 2.搭建Heroku部 ...

  8. Windows 10正式版官方原版ISO镜像下载

    [微软官方]下载地址1:官方下载工具(32-位系统版本)官方下载工具(64-位系统版本) [MSDN]下载地址2:cn_windows_10_multiple_editions_x64_dvd_684 ...

  9. c#_表单处理方式

    阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Aj ...

  10. VIM标记 mark 详解

    转载:http://blog.163.com/lgh_2002/blog/static/44017526201081154512135/ 我的vim配置:http://pan.baidu.com/s/ ...