C#事件浅入

为什么要使用事件呢?举个简单的例子,比如说你的界面上有个bottom按钮,然后你写了一个点击一下这个按钮就弹出一个消息窗口的代码,然而你要弹出消息窗口的这个事,开发控件的人并不知道,所以开发者预先定义好了这个事件,他并不关心你点击这个按钮要干什么,但是按钮却通过点击事件调用了你的代码。

其实事件说简单点:就像委托一样,只是他多了一个约束,这个约束就是当XXX达到了某个时刻(某个点),然后就触发了XXX事情;

还不理解,没关系,看个小例子;大家平时都喜欢关注微博吧,就拿这个做个例子吧,可能不是很好,凑合着看看吧;

粉丝(Fans)关注了大V(bigV),相当于订阅了一个事件

大V发了一条微博,相当于产生了一个事件

在这个事件中Fans收到了大V的微博,下面是具体代码

这是微博的内容,即事件的一个参数

 public class MicroBlogEventArgs : EventArgs
 {
     private DateTime sendDateTime;
     public DateTime SendDateTime { get { return this.sendDateTime; } }
     private string author;
     public string Author { get { return this.author; } }
     private string context;
     public string Context { get { return this.context; } }

     public MicroBlogEventArgs(DateTime createDateTime, string author, string context)
     {
         this.sendDateTime = createDateTime;
         this.author = author;
         this.context = context;
     }
 }

这是大V对象,大V定义了事件

public class BigV
 {
    private string name;
    public BigV(string name) {
        this.name = name;
    }
    public event EventHandler<MicroBlogEventArgs> SendMicroBlog;

    /// <summary>
    /// 由大V产生一个事件(即大V发了一条微博)
    /// </summary>
    /// <param name="e"></param>
    public void OnSendMicroBlog(MicroBlogEventArgs e) {
        System.Threading.Interlocked.CompareExchange(ref SendMicroBlog, null, null);
        if (SendMicroBlog!=null)
        {
            SendMicroBlog(this, e);
        }
    }

    public void SimulateSendMicroBlog(DateTime dt,string context) {
        MicroBlogEventArgs e = new MicroBlogEventArgs(dt, this.name, context);
        OnSendMicroBlog(e);
    }
 }

下面这个就是Fans了,fans只要关注(订阅)大V,就可以看到大V的微博了

 public class Fans
 {
     public Fans( BigV bigV)
     {
         bigV.SendMicroBlog += new EventHandler<MicroBlogEventArgs>(bigV_SendMicroBlog);
     }

     void bigV_SendMicroBlog(object sender, MicroBlogEventArgs e)
     {
         Console.WriteLine("{0},{1}发了:{2}", e.SendDateTime, e.Author, e.Context);
     }
 }

下面就是模拟,大V发微博,然后关注他的fans就能收到他的微博了

class Program
{
    static void Main(string[] args)
    {
        BigV bigV = new BigV("zhangsan");
        Fans fans = new Fans(bigV);
        bigV.SimulateSendMicroBlog(DateTime.Now, "NO ZUO NO DIE");

        Console.ReadKey();
    }
}

其实大家都知道事件是怎么一回事,只是拿代码来表示的时候就感觉怎么也写不出来,所以大家不妨在网上多找几个例子练练,今天就到此吧

C#事件浅入,布布扣,bubuko.com

时间: 2024-10-12 16:25:50

C#事件浅入的相关文章

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出---JQuery到底是什么?

学习完了JQuery之后,我便感觉云里雾里的,JQuery到底是什么,朦朦胧胧感觉到JQuery应该是javascript函数的封装,就应该像WinForm窗体应用程序中可以调用的系统函数,据之前所学的javascript,知道JavaScript是一种镶嵌在HTML文档中的一种脚本语言, <body> <formid="form1" name="form1" method="post" > <label for=&

『浅入深出』MySQL 中事务的实现

在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇文章中,我们将对事务的实现进行分析,尝试理解数据库是如何实现事务的,当然我们也会在文章中简单对 MySQL 中对 ACID 的实现进行简单的介绍. 事务其实就是并发控制的基本单位:相信我们都知道,事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位:数据库事务的 ACID 四大特性是事务的基础,了解了 AC

浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的.而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入. 首先什么是SQL注入呢? 实战篇~~~~~~~~~~ SQL注入概念 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em

浅入浅出EmguCv(三)EmguCv打开指定视频

打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图片>一样,只不过处理程序编程如下所示: 1 /// <summary> 2 /// 点击按钮打开指定图片 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <pa

C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈

C#控件中的KeyDown.KeyPress 与 KeyUp事件浅谈 研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的定义 4.KeyDown.KeyUp 和KeyPress 之间的区别 5.如何区分是否按的是小键盘? 6.PrScrn按键三个事件能够捕获吗? 7.{菜单键}和{开始键}KeyPress能够捕获吗? 8.如何捕获系统的组合键? 9