委托


  • 语法

 [访问修饰符] 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修饰符的参数,但可以访问在外部声明的其他变量。

事件


  事件是一种特殊的委托,在某件事情发生时,一个对象可以通过事件通知另一个对象。

  1. 定义事件
  2. 为对象订阅该事件
  3. 将发生的事件通知给订阅人
 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)处理机制的更多相关文章

  1. JavaScript -- 时光流逝(八):js中的事件Event的使用

    JavaScript -- 知识点回顾篇(八):js中的事件Event的使用 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. (1) onabort : onabort 事件会在图像 ...

  2. Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...

  3. 简单剖析Node中的事件监听机制(一)

    使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...

  4. pythonl练习笔记——threading线程中的事件Event

    1 事件Event 使用方法:e = threading.Event() Event对象主要用于线程间通信,确切地说是用于主线程控制其他线程的执行. Event事件提供了三个方法:wait等待.cle ...

  5. Java 中的事件监听机制

    看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. ...

  6. javascript中的事件Event

    一.事件流 1.事件流:描述的是从页面中接受事件的顺序 IE的事件流是事件冒泡流,Netscape的事件流是事件捕获流. 2.事件冒泡 IE的事件流叫做事件冒泡(event bubbing),即事件开 ...

  7. Springboot中的事件Event

    事件Event作为一种常用的线程通讯工具,在Springboot中可以方便地提供开发者进行线程交互. 1.事件定义 1 import org.springframework.context.Appli ...

  8. 【Spring】9、Spring中的事件Event

    Spring的ApplicationContext 提供了支持事件和代码中监听器的功能. 我们可以创建bean用来监听在ApplicationContext 中发布的事件.ApplicationEve ...

  9. 前端中的事件循环eventloop机制

    我们知道 js 是单线程执行的,那么异步的代码 js 是怎么处理的呢?例如下面的代码是如何进行输出的: console.log(1); setTimeout(function() { console. ...

随机推荐

  1. 自制基于HMM的python中文分词器

    不像英文那样单词之间有空格作为天然的分界线, 中文词语之间没有明显界限.必须采用一些方法将中文语句划分为单词序列才能进一步处理, 这一划分步骤即是所谓的中文分词. 主流中文分词方法包括基于规则的分词, ...

  2. 在ASP.NET MVC中使用Grid.mvc

    很久没有写ASP.NET的博文了,专心工作嘛,今天写一点MVC的博文,也是自己练习来的,是使用grid.mvc来显示数据. 首先打开Manage Nuget Packages,搜索grid.mvc并安 ...

  3. sql union 语句 case语句

    1:Union语句: 把两个结果合为一体(但是完全重复的数据会去掉) Eg1: select name, age, ‘学生无工资’ from student        union         ...

  4. C++标准模板库STL

    STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间. STL的代码 ...

  5. 常见对象(int和String类型的相互转换)

    public class Test03 { //基本数据类型包装类有八种,其中其中都有parsexxx的方法 //可以加将这七种字符串表现形式转换成基本数据类型 //char的包装类Character ...

  6. Spring Data Solr —— 快速入门

    Solr是基于Lucene(全文检索引擎)开发,它是一个独立系统,运行在Tomcat或Jetty(solr6以上集成了jetty,无需再部署到servlet容器上),但其原生中文的分词词功能不行,需要 ...

  7. django 参考

    1. 路由系统 https://www.cnblogs.com/maple-shaw/articles/9282718.html 2. 视图 https://www.cnblogs.com/maple ...

  8. Node.js-串行化流程控制

    内容主要来源:吴海星译,<Node.js实战>. 串行任务:需要一个接着一个坐的任务叫做串行任务. 可以使用回调的方式让几个异步任务按顺序执行,但如果任务过多,必须组织一下,否则过多的回调 ...

  9. ES6——TDZ(暂时性死区)

    暂时性的死区(Temporal Dead Zone),简写为 TDZ: 只要块级作用域里存在let命令,它所声明的变量就绑定这个区域,不在受外部的影响 let 和 const 声明的变量不会被提升到作 ...

  10. [基础知识]在PeopleSoft中SMTP设置不生效如何查找问题

    在PeopleSoft中如果配置了工作流邮件或者标准页面的通知,都是可以发送出邮件的,这些邮件都是由SMTP服务器发送.SMTP需要在APP服务器和PRCS服务器中配置. 如果无法从PeopleSof ...