C#中的事件(event)处理机制
委托
语法
[访问修饰符] delegate 返回类型 委托名();
- 委托的特点
类似于C++函数指针,但它是类型安全的;委托允许将方法作为参数进行传递;委托可用于定义回调方法;委托可以链接在一起:如,可以对一个事件调用多个方法。
委托在运行时确定调用哪种方法,且委托和方法必须具有相同的签名。
//定义委托
public delegate int Callback(int num1, int num2);
//定义方法类
class MathCalc{
//加法方法
public int Plus(int number1, int number2){
return number1 + number2;
}
} static void Main(string[] args){
//委托的对象
Callback objCall;
//实例MathCalc类的对象
MathCalc mc = new MathCalc();
//将方法与委托关联起来
objCall = new Callback(mc.Plus);
//可以用Callback objCall = new Callback(mc.Plus);声明委托并与方法关联
//将委托实例化
int result = objCall(, );
System.Console.WriteLine("结果为{0}", result);
}
匿名方法
委托能正常调用,须创建单独的方法,增加了实例化委托所需的编码系统开销。为此可以使用匿名方法,其不需要定义委托要引用的方法,而把要引用的方法的方法体作为实例化委托时的一个代码块紧跟在委托后面。
- 语法
委托类型 委托实例 = delegate([参数列表]) {
//代码块
}; //分号不能少
- 使用方法
class Program{
//定义委托
delegate int delSum(int num1, int num2);
static void Main(string[] args){
int third = ;
//将代码传递为委托参数
delSum deladd = delegate(int first, int second){
int sum = first + second;
return sum;
};
int total = deladd(, ) + third;
Console.WriteLine("1+2+3="+total);
}
}
- 匿名方法的特点
匿名方法的优点是减少了系统的开销,方法仅在由委托使用时才定义。匿名方法有助于降低代码的复杂性,但如果委托代码块的代码很多则容易混淆代码,降低程序的可读性。
在匿名方法中不能使用跳转语句跳转到匿名方法的外部,同样匿名方法外部的跳转语句也不能跳转到匿名方法的内部。匿名方法不能访问在外部使用ref和out修饰符的参数,但可以访问在外部声明的其他变量。
事件
事件是一种特殊的委托,在某件事情发生时,一个对象可以通过事件通知另一个对象。
- 定义事件
- 为对象订阅该事件
- 将发生的事件通知给订阅人
public class MeltdownEventArgs : EventArgs {
private string message;
public MeltdownEventArgs(string message) {
this.message = message;
}
public string Message {
get {
return message;
}
}
}
public class Reactor {
private int temperature;
//定义委托
public delegate void MeltdownHandler(object reactor, MeltdownEventArgs MEA);
//定义事件
public event MeltdownHandler OnMeltdown;
public int Temperature {
set {
temperature = value;
//当温度值高于1000时,创建叫myMEA的MeltdownEventArgs对象,并把字符串传递进来给myMEA的message属性,然后产生OnMeltdown事件,把当前的Reactor对象和myMEA作为参数传递给OnMeltdown
if (temperature > ){
MeltdownEventArgs myMEA = new MeltdownEventArgs("Reactor meltdown in progress!");
OnMeltdown(this, myMEA);
}
}
}
}
public class ReactorMonitor {
//ReactorMonitor构造函数接收Reactor对象myReactor为参数
public ReactorMonitor(Reactor myReactor) {
//该构造函数为OnMeltdown事件监视myReactor对象。当myReactor对象产生OnMeltdown事件时,DisplayMessage()方法会被调用来处理这个事件
myReactor.OnMeltdown += new Reactor.MeltdownHandler(DisplayMessage);
}
public void DisplayMessage(object myReactor, MeltdownEventArgs myMEA) {
Console.WriteLine(myMEA.Message);
}
}
public static void Main(string[] args) {
Reactor myReactor = new Reactor();
ReactorMonitor myReactorMonitor = new ReactorMonitor(myReactor);
Console.WriteLine("Setting reactor temperature to 100 degrees Centigrade");
//设置温度值为100
myReactor.Temperature = ;
Console.WriteLine("Setting reactor temperature to 2000 degrees Centigrade");
//设置温度值为2000
myReactor.Temperature = ;
}
C#中的事件(event)处理机制的更多相关文章
- JavaScript -- 时光流逝(八):js中的事件Event的使用
JavaScript -- 知识点回顾篇(八):js中的事件Event的使用 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. (1) onabort : onabort 事件会在图像 ...
- Java中的事件监听机制
鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...
- 简单剖析Node中的事件监听机制(一)
使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...
- pythonl练习笔记——threading线程中的事件Event
1 事件Event 使用方法:e = threading.Event() Event对象主要用于线程间通信,确切地说是用于主线程控制其他线程的执行. Event事件提供了三个方法:wait等待.cle ...
- Java 中的事件监听机制
看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. ...
- javascript中的事件Event
一.事件流 1.事件流:描述的是从页面中接受事件的顺序 IE的事件流是事件冒泡流,Netscape的事件流是事件捕获流. 2.事件冒泡 IE的事件流叫做事件冒泡(event bubbing),即事件开 ...
- Springboot中的事件Event
事件Event作为一种常用的线程通讯工具,在Springboot中可以方便地提供开发者进行线程交互. 1.事件定义 1 import org.springframework.context.Appli ...
- 【Spring】9、Spring中的事件Event
Spring的ApplicationContext 提供了支持事件和代码中监听器的功能. 我们可以创建bean用来监听在ApplicationContext 中发布的事件.ApplicationEve ...
- 前端中的事件循环eventloop机制
我们知道 js 是单线程执行的,那么异步的代码 js 是怎么处理的呢?例如下面的代码是如何进行输出的: console.log(1); setTimeout(function() { console. ...
随机推荐
- [SPOJ 687]Repeats
Description 题库链接 给出一个长度为 \(n\) 的字符串,求重复次数最多的连续重复子串. \(1\leq n\leq 50000\) Solution Code #include < ...
- Silverlight 查询DataGrid 中匹配项 ,后台改变选中行颜色
需求:根据关键字(参会人号码或名称)查找参会人,在datagird 中高亮显示 界面:我在界面上增加了一个文本框和按钮,进行查找操作 操作说明: 根据关键字进行搜索:输入关键字 点击查找,如果找到 以 ...
- 从零开始学JAVA(09)-使用SpringMVC4 + Mybatis + MySql 例子(注解方式开发)
项目需要,继续学习springmvc,这里加入Mybatis对数据库的访问,并写下一个简单的例子便于以后学习,希望对看的人有帮助.上一篇被移出博客主页,这一篇努力排版整齐,更原创,希望不要再被移出主页 ...
- MVC应用程序使用Entity Framework
创建空的MVC应用程序,为了想使用Entity Framework的类库,发现即无法正常引用.如下图,Insus.NET已经明确引了System.Data.Entity(下图Highlight的代码) ...
- karma + jasmine 构建前端自动化测试
http://blog.fens.me/nodejs-karma-jasmine/ 很全的文档 执行karma init时报错如下: $ karma init > readline.js:5 ...
- spring装配注解(IOC容器加载控制)ComponentScan及ComponentScans使用
ComponentScan,只写入value,可扫描路径下装配的@Contrller.@Service.@Repository @ComponentScan(value = "com.tes ...
- 如何在SpringMVC中使用REST风格的url
如何在SpringMVC中使用REST风格的url 1.url写法: get:/restUrl/{id} post:/restUrl delete:/restUrl/{id} put:/restUrl ...
- Linux 安装redis,redis发布订阅,持久化
安装redis 1.安装redis的方式 -yum (删除这个yum安装的redis,我们只用源码编译安装的) -rpm -源码编译 2.删除原本的redis yum remove redis -y ...
- 图片链接转成base64
一半需要我的图像转换为base64字符串,这样我们可以把我的形象到服务器.现在我们提供一个js: function convertImgToBase64(url, callback, outputFo ...
- python学习之老男孩python全栈第九期_day002作业
1. 判断下列逻辑语句的True,False.(1) 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6Tru ...