C#中的事件(event)处理机制

委托


  • 语法
1 [访问修饰符] delegate 返回类型 委托名();
  • 委托的特点

  类似于C++函数指针,但它是类型安全的;委托允许将方法作为参数进行传递;委托可用于定义回调方法;委托可以链接在一起:如,可以对一个事件调用多个方法。

  委托在运行时确定调用哪种方法,且委托和方法必须具有相同的签名。

 1 //定义委托
 2 public delegate int Callback(int num1, int num2);
 3 //定义方法类
 4 class MathCalc{
 5     //加法方法
 6     public int Plus(int number1, int number2){
 7         return number1 + number2;
 8     }
 9 }
10
11 static void Main(string[] args){
12     //委托的对象
13     Callback objCall;
14     //实例MathCalc类的对象
15     MathCalc mc = new MathCalc();
16     //将方法与委托关联起来
17     objCall = new Callback(mc.Plus);
18     //可以用Callback objCall = new Callback(mc.Plus);声明委托并与方法关联
19     //将委托实例化
20     int result = objCall(1, 2);
21     System.Console.WriteLine("结果为{0}", result);
22 }

匿名方法



  委托能正常调用,须创建单独的方法,增加了实例化委托所需的编码系统开销。为此可以使用匿名方法,其不需要定义委托要引用的方法,而把要引用的方法的方法体作为实例化委托时的一个代码块紧跟在委托后面。

  • 语法
1 委托类型 委托实例 = delegate([参数列表]) {
2   //代码块
3 }; //分号不能少
  • 使用方法
 1 class Program{
 2     //定义委托
 3     delegate int delSum(int num1, int num2);
 4     static void Main(string[] args){
 5         int third = 3;
 6         //将代码传递为委托参数
 7         delSum deladd = delegate(int first, int second){
 8             int sum = first + second;
 9             return sum;
10         };
11         int total = deladd(1, 2) + third;
12         Console.WriteLine("1+2+3="+total);
13     }
14 }
  • 匿名方法的特点

  匿名方法的优点是减少了系统的开销,方法仅在由委托使用时才定义。匿名方法有助于降低代码的复杂性,但如果委托代码块的代码很多则容易混淆代码,降低程序的可读性。

  在匿名方法中不能使用跳转语句跳转到匿名方法的外部,同样匿名方法外部的跳转语句也不能跳转到匿名方法的内部。匿名方法不能访问在外部使用ref和out修饰符的参数,但可以访问在外部声明的其他变量。

事件



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

  1. 定义事件
  2. 为对象订阅该事件
  3. 将发生的事件通知给订阅人
 1 public class MeltdownEventArgs : EventArgs {
 2     private string message;
 3     public MeltdownEventArgs(string message) {
 4         this.message = message;
 5     }
 6     public string Message {
 7         get {
 8             return message;
 9         }
10     }
11 }
12
13 public class Reactor {
14     private int temperature;
15     //定义委托
16     public delegate void MeltdownHandler(object reactor, MeltdownEventArgs MEA);
17     //定义事件
18     public event MeltdownHandler OnMeltdown;
19     public int Temperature {
20         set {
21             temperature = value;
22             //当温度值高于1000时,创建叫myMEA的MeltdownEventArgs对象,并把字符串传递进来给myMEA的message属性,然后产生OnMeltdown事件,把当前的Reactor对象和myMEA作为参数传递给OnMeltdown
23             if (temperature > 1000){
24                 MeltdownEventArgs myMEA = new MeltdownEventArgs("Reactor meltdown in progress!");
25                 OnMeltdown(this, myMEA);
26             }
27         }
28     }
29 }
30
31 public class ReactorMonitor {
32     //ReactorMonitor构造函数接收Reactor对象myReactor为参数
33     public ReactorMonitor(Reactor myReactor) {
34         //该构造函数为OnMeltdown事件监视myReactor对象。当myReactor对象产生OnMeltdown事件时,DisplayMessage()方法会被调用来处理这个事件
35         myReactor.OnMeltdown += new Reactor.MeltdownHandler(DisplayMessage);
36     }
37     public void DisplayMessage(object myReactor, MeltdownEventArgs myMEA) {
38         Console.WriteLine(myMEA.Message);
39     }
40 }
41
42 public static void Main(string[] args) {
43     Reactor myReactor = new Reactor();
44     ReactorMonitor myReactorMonitor = new ReactorMonitor(myReactor);
45
46     Console.WriteLine("Setting reactor temperature to 100 degrees Centigrade");
47     //设置温度值为100
48     myReactor.Temperature = 100;
49     Console.WriteLine("Setting reactor temperature to 2000 degrees Centigrade");
50     //设置温度值为2000
51     myReactor.Temperature = 2000;
52 }

原文地址:https://www.cnblogs.com/goalie/p/9463901.html

时间: 2024-10-07 18:02:40

C#中的事件(event)处理机制的相关文章

Java中的事件监听机制

鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动作发生在哪个组件上,那么该组件就是事件源对象 2.事件监听方法: addMouseListener(MouseListener ml) ;该方法主要用来捕获鼠标的释放,按下,点击,进入和离开的动作:捕获到相应的动作后,交由事件处理类(实现MouseListener接口)进行处理. addAction

Java 中的事件监听机制

看项目代码时遇到了好多事件监听机制相关的代码.现学习一下: java事件机制包含三个部分:事件.事件监听器.事件源. 1.事件:继承自java.util.EventObject类,开发人员自己定义. package com.shuyan.javatest.EventTest; import java.util.EventObject; public class DnsEvent extends EventObject { private String userData; private long

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

1 事件Event 使用方法:e = threading.Event() Event对象主要用于线程间通信,确切地说是用于主线程控制其他线程的执行. Event事件提供了三个方法:wait等待.clear清除信号False.set设置信号True. Event事件实现通信机制:全局定义了一个"Flag"(默认为False),若Flag信号被clear为False,则执行event.wait方法时会阻塞:若Flag信号被set为True,则执行event.wait方法时便不阻塞. Eve

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

使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效.并且Node中的大量模块都使用了Event机制,因此可以说是整个Node中最重要的模块之一. 实例: let event = new eventEmitter(); event.on('someType',function(){ }); even

javascript中的事件Event

一.事件流 1.事件流:描述的是从页面中接受事件的顺序 IE的事件流是事件冒泡流,Netscape的事件流是事件捕获流. 2.事件冒泡 IE的事件流叫做事件冒泡(event bubbing),即事件开始时由具体的元素接受,然后逐级向上传播到较为不具体的节点.如果点击div.则事件流如下 div --> body --> html --> body 事件冒泡的过程如图 3.事件捕获 Netscape提出的事件流是事件捕获(event capturing),即不太具体的节点更早的接受到事件,

Android中Touch事件的传递机制

由于之前对于android的事件传递机制不了解,今天正好不忙,赶紧抽出时间来理一下这方面的知识,本文结合demo,对android的事件传递机制进行分析. 在事件传递过程中,离不开以下三个方法: 1.dispatchTouchEvent 分发touchEvent,返回值为true时表示TouchEvent被当前View处理,事件不会向下层传递(包括后续的onInterceptTouchEvent和onTouchEvent), dispatchTouchEvent会收到后续的ACTION_MOVE

vue中的事件监听机制

事件监听 基础用法 监听dom事件使用v-on指令: v-on:事件类型="一个函数" .这个事件类型可以自定义. v-on 指令绑定事件后,就会监听相应的事件,并在触发时运行一些 JavaScript 代码. <div id="box1"> <button v-on:click="counter += 1">点我</button> <p>已点击 {{ counter }} 次</p>

【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是吃鸡,唉!真是罪过罪过.希望能从这篇博客开始有些改善吧,尽量少玩耍,还是多学习吧~ 好了扯得有点远了,来说说我们今天博客的主题——“用C#和Lua实现Unity中的事件分发机制”,事件分发机制或者叫事件监听派发系统,在每个游戏框架中都是不可或缺的一个模块.我们可以用它来解耦,监听网络消息,或者做一些

观察者模式与事件监听机制

一.观察者模式 1.1 概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己.它类似B/S架构模式,构建一个服务端,多个客户端显示.其实这个主题对象就像是一个信息源,当信息源的状态发送变化时,它会通知所有订阅者,使它们进行相应的处理.在百度百科中的例子是,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上. 1