事件是C#语言的重要成员之一,初学者往往不能很好的去理解和运用事件,特别是自定义事件。在这里将以较简单的方式呈现事件最基本的用法。

1.事件的定义

给事件下个准确的定义是一个较困难的事,这里我暂且给它定义为:事件是两个对象之间的交互行为,这里关注四个字“两个对象”。不理解不要紧,这样定义本身并不准确。,继续往下看。

事件定义之前先声明一个委托,然后声明一个事件:

 //声明委托
public delegate void GetStrHandler(string x, string y);
//声明事件
public event GetStrHandler GetStr;

2.事件的三要素

学会运用事件,一定要知道事件的三要素:事件拥有者、事件订阅者、事件处理方法。

事件拥有者:也叫事件发布者,个人觉得用拥有者更方便理解,很显然,谁定义事件谁就是事件的拥有者。具体到代码中也就是哪个类中定义了的事件,那么这个类的实例就是事件的拥有者。

事件订阅者:可理解为“盯着”事件拥有者的某个行为的对象。

事件处理方法:事件触发后要执行的方法。当事件订阅者“发现”事件拥有者的事件被触发时,事件订阅者需要去执行的方法。仔细口味这句话,不难发现事件处理方法是定义在事件订阅者中,后面的代码会体现出来。

3.事件的运用

下面看完整示例代码:

    //声明委托
public delegate void GetStrHandler(string x, string y); public class TestA
{
//声明事件
public event GetStrHandler GetStr;
public void Do(string x, string y)
{
GetStr(x, y);
}
} public class TestB
{
private TestA _A;
public TestB(TestA a)
{
_A = a;
_A.GetStr += OnGetStr;//事件的订阅
} //事件处理方法
private void OnGetStr(string x, string y)
{
Console.WriteLine(string.Format("{0}+{1}", x, y));
}
} class Program
{
static void Main(string[] args)
{
TestA a = new TestA();
TestB b = new TestB(a);
a.Do("a", "b");//事件的触发
Console.ReadKey();
}
}

下面按2中的事件三要素来剖析这段代码:

1.首先定义一个委托类型:void GetStrHandler(string x, string y),为事件的声明作准备。

2.定义事件拥有者的类,即class TestA,事件拥有者是这个类的实例对象即TestA a = new TestA();中定义的a。这个类中定义了事件GetStr。

3..定义事件订阅者的类,即class TestB ,事件拥订阅者是这个类的实例对象即TestB b = new TestB(a);中定义的b,仔细看看TestB的构造方法,发现它依赖于对象a,这是因为订阅者需要监听事件拥有的事件,因此需要把事件拥有者“引”进来,使订阅者能实现事件订阅。

4.定义事件处理方法:在三要素中已强调过,事件处理方法是在订阅者中定义的,表示事件触发时需要执行的方法。这里就是执行了“Console.WriteLine(string.Format("{0}+{1}", x, y));”这个动作。

5.事件的触发:在代码中就是a.Do("a", "b");这一句。通过代码发现,a.Do("a", "b")实际上是调用了对象b中的OnGetStr方法,所谓的事件“订阅”相当于是把符合委托“模板”的方法OnGetStr传递过去,最终执行的是OnGetStr方法。这样的语言描述可能不准确,得多体会才行。

4.总结

以上是对事件的一个基本运用作了一个简单描述。实际上事件订阅者是可以有多个,也就会有多个事件处理程序,事件就变成一个对象与另外一个或者多个对象的交互。当然事件拥有者也可以定义多个不同的事件,提供给不同的事件订阅者订阅。上面只是事件运用的方式之一,事件的拥有者和订阅者可以是其它形式,如静态类等,不一定是类的实例。

C#基础——事件初步的更多相关文章

  1. Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别

    Task C# 多线程和异步模型 TPL模型   Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...

  2. 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”

    回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...

  3. 第一百六十九节,jQuery,基础事件

    jQuery,基础事件 学习要点: 1.绑定事件 2.简写事件 3.复合事件 JavaScript 有一个非常重要的功能,就是事件驱动.当页面完全加载后,用户通过鼠标 或键盘触发页面中绑定事件的元素即 ...

  4. C#基础---事件的使用

    一:什么是事件     事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框.每一种控件有自己可以识别的事件,如窗体的加载.单击.双击等事件,编辑框(文本框)的文本改变事件,等等.事 ...

  5. 9、网页制作Dreamweaver(jQuery基础:事件)

    事件 定义 即当HTML中发生某些事(点击.鼠标移过等)的时候调用的方法 $(selector).action() 触发 事件的触发有两种方法: 1.直接将事件click写在<javascrip ...

  6. C#之事件初步

    上文简述了委托,所谓的简述,只是说了一下如何使用委托,既然有了委托的基础,便可以稍微一探事件的机制. 事件,实际上是委托类型,事件处理函数如下: public delegate void MyHand ...

  7. JS基础——事件绑定

    上一篇博客JS事件对象中,老师问JS事件处理和VB中的事件处理有什么联系?先来解决一下这个问题.举个VB.net中事件处理的样例(JS敲久了,VB习惯的都不熟悉了,看来得常常回想了): 1.事件处理V ...

  8. javascript基础-事件1

    原理 事件分两种.第一种浏览器事件,由浏览器抛出事件,它是人机交互的基础:第二种自定义事件,由程序员抛出事件,它是模拟事件流程.两者都是为了完成数据的传递. 浏览器事件 机制 冒泡和捕获两种机制.因I ...

  9. javascript基础-事件2

    DOM0,DOM2,DOM3事件类型 图解: 范畴 响应顺序(标:标准浏览器.IE9+) 注意点 MouseEvent 标: mousedown-mouseup-click-mousedown-mou ...

随机推荐

  1. Go中的反射reflect

    前面我们在学习到struct结构体的时候,因为结构体中的字段首字母大写,而我们想把json文件映射到该结构体上时,需要在在结构体字段后面加上json标签,表明结构体字段和json字段的映射关系.这其中 ...

  2. 如何用Hexo+Github创建自己的技术博客

    注册一个github GitHub官网.按照一般的网站注册登录执行就好了,不详细说. 安装git 安装很简单,一直下一步 git安装教程 很多教程里都说要配置环境变量,我本人安装过5次左右的git,一 ...

  3. TP5使用API时不可预知的内部异常

    最常见的错误形式例如 controller不存在或者 action不存在之类的 我们第一时间想到的 就是 使用 try{}catch(){} 来捕获 例如: /** * show方法在common里定 ...

  4. 基于.NET Core开发的个人博客发布至CentOS小计

    早些时候,使用 .NET Framework 开发网站,只能部署在 Windows 服务器上面,近两年 .NET Core 如火如荼,乘此机会赶紧上车,最近将自己利用 .NET Core 开发的个人博 ...

  5. 安利一个免费下载VIP文档神器

    今天安利给大伙一个非非非常好用的可以免费下载VIP文档的下载神器------冰点文库下载器,用过的人都说好.操作简单,小巧轻便,完全免费.支持百度.豆丁.畅享.mbalib.hp009.max.boo ...

  6. java io读取性能对比

    背景 从最早bio的只支持阻塞的bio(同步阻塞) 到默认阻塞支持非阻塞nio(同步非阻塞+同步阻塞)(此时加入mmap类) 再到aio(异步非阻塞) 虽然这些api改变了调用模式,但真正执行效率上是 ...

  7. 使用sc 命令写脚本 添加和删除服务 简单应用

    添加服务 @echo.服务启动...... @echo off @sc create 服务名 binPath= "%~dp0\服务路径" @sc config 服务名 start= ...

  8. (转载)分享常用的GoLang包工具

    分享常用的GoLang包工具 包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/e ...

  9. mybatis逆向工程maven版本idea工具

    基于springboot2版本 pom基本依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...

  10. Docker系列之AspNetCore Runtime VS .NetCore Runtime VS .NET Core SDK(四)

    前言 接下来我们就要慢慢步入在.NET Core中使用Docker的殿堂了,在开始之前如题,我们需要搞清楚一些概念,要不然看到官方提供如下一系列镜像,我们会一脸懵逼,不知道到底要使用哪一个. AspN ...