委托
语法
[访问修饰符] 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. ...
随机推荐
-
实现滑动条与表单中的input中的value交互
最近在写一个考试系统的项目,遇到一些比较有意思的小知识,在这里分享给大家 下面是一个滑动条与input中的value值的交互,即滑动条的颜色会跟随给定input的value值实时变化,虽然表单中的ra ...
-
AO安装需要Microsoft Visual Studio 2013?
从接触ArcGIS9.2到 10.4,在不断升级的 过程中,既给我们带来了很多惊喜,也带来一些麻烦,因为ArcGIS版本不兼容.出于体验,安装了ArcGIS Desktop10.4,AO也得升到10. ...
-
ASP.NET导出bdf文件
1.导出助手类 using System;using System.IO;using System.Data;using System.Data.OleDb;using System.Web;usin ...
-
【转载】locate命令的使用
[说明]转载自 http://www.cnblogs.com/flysnail/archive/2012/05/16/2504266.html 使用locate命令,遇到了这样的情况:当前目录下有一个 ...
-
关于C++几个容易混淆的概念总结
1.函数指针和指针函数 函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象.函数指针的定义: int (*func)(int a, int b); // 声明函数指针 指 ...
-
WebService两种调用方法
1.wsimport生成本地客户端代码 命令提示窗口执行生成命令. 格式:wsimport -s "src目录" -p “生成类所在包名” -keep “wsdl发布地址” 示例: ...
-
Async和Await 异步方法
Async和Await关键字是C#异步编程的核心.通过使用这两个关键字,你可以使用.NET Framework或Windows Runtime的资源创建一个异步方法如同你创建一个同步的方法一样容易.通 ...
-
Halcon之 Variation Model(转)
Variation Model的主要原理是将待检测的图像与一张标准图像作比较,找出待检测图像与标准图像(ideal image)的明显差异(也就是不良).标准图像可以采用几张OK品的图像训练(trai ...
-
dubbo原理
1,观察DubboBeanDefinitionParser 的构造方法,给它打一个断点,发现其前一步在DubboNamespaceHandler 应用启动会连续调此方法 DubboBeanDefini ...
-
IDEA简单部署MVC项目
本文章主要参考七小栈主的文章,特此说明: 前提 在配置好JDK,配置好Maven,配置链接如下:如何配置Java环境,包括JDK,Maven等 建项目 IEDA中File->New->Pr ...