委托


  • 语法

 [访问修饰符] 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. 数据存储之偏好设置NSUserDefaults

    NSUserDefaults做数据存储也是比较常用,适合轻量级的本地数据存储,读取也很方便. 一.支持的数据类型如下图(NSString.NSArray.NSDictionary.NSData.NSI ...

  2. spring@value取不到值的几种情况

    一,spring组件重写构造方法,在构造方法中引用@value为null 由于spring实例化顺序为先执行构造方法,再注入成员变量,所以序为先执行构造方法,再注入成员变量,所以ing实例化顺取值为n ...

  3. 设计模式学习--面向对象的5条设计原则之开放封闭原则--OCP

    一.OCP简介(OCP--Open-Closed Principle):Software entities(classes,modules,functions,etc.) should be open ...

  4. sql语句将查询的结果拼接成字符串

    表样: sqlserver: --方法1 DECLARE @STR VARCHAR(8000) SELECT @STR=ISNULL(@STR+',','')+userID FROM (SELECT  ...

  5. 【转】SAP HANA学习资料大全[非常完善的学习资料汇总]

    Check out this SDN blog if you plan to write HANA Certification exam http://scn.sap.com/community/ha ...

  6. Java虚拟机--线程安全和锁优化

    Java虚拟机--线程安全和锁优化 线程安全 线程安全:当多线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象 ...

  7. 【14】代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性.这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  8. Async Await异步调用WebApi

    先铺垫一些基础知识 在 .net 4.5中出现了 Async Await关键字,配合之前版本的Task 来使得开发异步程序更为简单易控.   在使用它们之前 我们先关心下 为什么要使用它们.好比 一个 ...

  9. POJ1149(最大流)

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 21678   Accepted: 9911 Description ...

  10. php中的或运算

    1.今天碰到一个php或运算的面试题,很有趣,和大家分享一下.开始不明白什么原因. <?php $a = 0; $b = 0; if($a=3)>0 || ($b=3)>0) { $ ...