博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行...
阅读量:6291 次
发布时间:2019-06-22

本文共 3064 字,大约阅读时间需要 10 分钟。

名称有点饶,不是很好理解,但我喜欢这种大白话,不喜欢书所翻译过来的话,呵呵!

今天要把一个不确定的问题解决,问题是:一个程序中,有一个属性,如果它为true时,我希望把另一些方法自动运行,这是可以通过订阅事件来实现的,对吗?经过我的测试确实是这样的,呵呵。

事件一个一直叫我们头痛的话题,一个能不用就不用的东西,我们程序员为什么那么怕“事件”呢?我来分析几个原因

1 对本身的概念不是很理解

2 对它的作用不是很清晰,可能书上说不到点上,个人认为

3 平时用的少,所以对它更加陌生

今天,我就和大家一起再学习一个C#的事件

一说事件,就不行不说委托,这两者到底是什么关系呢,在我看来,委托就是一个类,而事件就是这个类的一个实例,呵呵,这样大家就容易理解了吧

事件由事件数据源,事件所发生的类和事件订阅者们组成,“事件订阅者们”就是说,一个事件可以被多个订阅都订阅。

开始写代码了,代码最能说明问题:

事件源类:

1  ///  2   /// 事件源 3   ///  4   internal class KeyEventArgs : EventArgs 5   { 6       private char keyChar; 7       public KeyEventArgs(char keyChar) 8           : base() 9       {10           this.keyChar = keyChar;11       }12 13       public char KeyChar14       {15           get16           {17               return keyChar;18           }19       }20   }

一都是以EventArgs 结尾的,其中EventArgs 本身它是所有事件源类的基类,它不提供任何事件源信息,如果有个性化的事件信息,需要去派生它

接下来看,发生事件的类,我们的事件就在这里发生,在什么时候,什么情况下发生,都来自这里。

1  ///  2     /// 事件发生的类 3  ///  4     internal class KeyInputMonitor 5     { 6         // 创建一个委托,返回类型为avoid,两个参数 7         public delegate void KeyDownEventHandler(object sender, KeyEventArgs e); 8         // 将创建的委托和特定事件关联,在这里特定的事件为OnKeyDown 9         public event KeyDownEventHandler OnKeyDown;10 11         public void Run()12         {13             bool finished = false;14             do15             {16                 Console.WriteLine("Input a char");17                 string response = Console.ReadLine();18 19                 char responseChar = (response == "") ? ' ' : char.ToUpper(response[0]);20                 switch (responseChar)21                 {22                     case 'X':23                         finished = true;24                         break;25                     default:26                         // 得到按键信息的参数27                         KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);28                         // 触发事件29                         OnKeyDown(this, keyEventArgs);30                         break;31                 }32             } while (!finished);33         }34     }
功能就是输入一个字符,当为X时,退出,当不为X时,去触发一个事件,事件源数据为“输入的字符”
到这里,这个事件还没有任何功能,就相当于,我去卖东西,东西已经摆在台上了,但还没有人来买,好,现在是时候有顾客来了
1  ///  2     /// 显示中文的接收类 3  ///  4     internal class EventReceiverForChina 5     { 6         public EventReceiverForChina(KeyInputMonitor monitor) 7         { 8             // 产生一个委托实例并添加到KeyInputMonitor产生的事件列表中 9             monitor.OnKeyDown += new KeyInputMonitor.KeyDownEventHandler(this.Echo);10         }11         private void Echo(object sender, KeyEventArgs e)12         {13           Console.WriteLine("您输入的字条是: {0}", e.KeyChar);14         }15     }

这里订阅事件时,我们使用+=就可以了,事实上就是建立一个委托类型的新事件实例而以。

在前台调用时,可以这样:
 
1         // 实例化一个事件发送器,并声明一个EventReceiverForChina类型的订阅者2   KeyInputMonitor monitor = new KeyInputMonitor();3   EventReceiverForChina eventReceiverForChina = new EventReceiverForChina(monitor);4  monitor.Run();
 
运行的结果就是当你去Run()时,eventReceiverForChina 类型时的某个方法也被执行了,怎么样,实现了我们今天的话题了吧,其实这就是事件的订阅机制,事实上在软件开发中非常有用。需要注意的是,一般事件的返回类型都是void,当然,这也是很正常的,因为事件就是去做某些事件,它不知道管后果的。呵呵。

祝您晚——来个好梦吧!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Vue------第二天(计算属性、侦听器、绑定Class、绑定Style)
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>
企业中最佳虚拟机软件应用程序—Parallels Deskto
查看>>
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>
Spring配置文件(2)配置方式
查看>>
MariaDB/Mysql 批量插入 批量更新
查看>>
ItelliJ IDEA开发工具使用—创建一个web项目
查看>>
solr-4.10.4部署到tomcat6
查看>>
切片键(Shard Keys)
查看>>