首页 > 编程语言 >一个例子帮你搞懂C#语言高级特性系列(02) --- 委托、事件和Lambda表达式

一个例子帮你搞懂C#语言高级特性系列(02) --- 委托、事件和Lambda表达式

时间:2023-06-20 13:01:42浏览次数:41  
标签:02 string OnAccelerate Car --- car msg 搞懂 public


直接看例子吧:

using System;
using System.Windows.Forms;
using System.Threading;

namespace Com.LoonStudio.Example {

    public class Car {
        // 定义一个汽车事件的委托
        public delegate void CarEventHandler(string msg);

        // 定义加速事件
        public event CarEventHandler OnAccelerate;
        // 定义爆炸事件
        public event CarEventHandler OnExpose;

        public int Speed { set; get; }      // 速度
        public bool Broken { set; get; }    // 是否损坏

        public Car() {
            Speed = 20;
            Broken = false;
        }

        public void Run() {
            while(!Broken) {
                Speed += 20;
                if (Speed > 120) {
                    Broken = true;
                    if (OnExpose != null) {     // 引发爆炸事件
                        OnExpose("坏瓜了, 搞毛线了...");    
                    }
                }
                else {
                    if (OnAccelerate != null) { // 引发加速事件
                        OnAccelerate(string.Format("正在加速, 目前时速{0}km/h", Speed));
                    }
                }
            }
        }

    }

    class Program {
        static void Main(string[] args) {
            Car car = new Car();
            car.OnAccelerate += msg => { Console.WriteLine(msg); }; // Lambda表达式
            car.OnExpose += new Car.CarEventHandler(Program.Foo);   // 事件委托
            car.OnAccelerate += delegate(string msg) { Thread.Sleep(1000); };   // 匿名方法
            car.Run();
        }

        private static void Foo(string msg) {
            MessageBox.Show(msg, "呕耶", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}



上面的例子演示了如何使用委托来做自定义事件,如何使用匿名方法来实现委托代理以及如何使用Lambda表达式。

其实,所谓的委托(delegate)在C语言中叫指向函数的指针,C++中叫仿函数(functor,有些翻译为函数对象),在Java中通过单方法接口回调(callback)来实现。说白了,就是把一个函数通过参数传到另一个函数里面。

另外,还要专门解释一下什么叫回调。普通的函数调用通常是高层代码(应用程序)去调用底层函数(如系统函数、库函数等)。回调则是底层函数执行时调用高层的代码,所以这个术语由此而得名。例如窗体应用中的事件机制,你为按钮、文本框绑定的事件处理代码是谁来调用的,这些都是操作系统收到事件消息后去调用你之前为事件绑定的代码。正常的调用都是我们去掉系统底层的东西,比如你调用Windows API获取当前系统中的前置窗口。这样说应该大概能说清楚什么叫回调了吧:)

标签:02,string,OnAccelerate,Car,---,car,msg,搞懂,public
From: https://blog.51cto.com/u_16166070/6521818

相关文章

  • [连载]C#程序设计(05)--- C#核心编程-3 --- 表达式和运算符
    ......
  • [连载]C#程序设计(09)--- 类和对象
    ......
  • Java面试题集(51-70)
    Java程序员面试题集(51-70)摘要:这一部分主要讲解了异常、多线程、容器和I/O的相关面试题。首先,异常机制提供了一种在不打乱原有业务逻辑的前提下,把程序在运行时可能出现的状况处理掉的优雅的解决方案,同时也是面向对象的解决方案。而Java的线程模型是建立在共享的、默认的可见的可变状......
  • 虚拟主机使用记录-20230620
    三丰云提供的免费虚拟主机和免费云服务器对于学生和初学者来说非常有吸引力,并且易于使用。同时,三丰云也提供付费计划,可以为更高级别的用户提供更多资源和功能支持。需要注意的是,免费服务通常会受到一些限制和局限性。因此,在选择免费主机或云服务器时,需要根据实际需求进行评估,以确保......
  • git --date时间显示设置格式命令
    git --date 显示与当前时间相关的日期relativelocaldefaultisorfcshortraw--date=relative显示用户本地时区中的时间戳。 --date=local(or--date=iso)以ISO8601格式显示时间戳。 --date=iso8601(or--date=rfc)以RFC2822格式显示时间戳,通常在电子邮件中找......
  • vue学习过程中 遇到的问题 CSS塌陷 ----- 高度塌陷和外边距塌陷
    1、高度塌陷原因:父元素没有设置高度,子元素设置浮动属性(float:left)之后,父元素的高度为0.***<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge">......
  • 「NOI2021」庆典
    首先可以注意到题面中的这个条件:对于三座城市\(x\),\(y\),\(z\),若\(x\Rightarrowz\)且\(y\Rightarrowz\),那么有\(x\Rightarrowy\)或\(y\Rightarrowx\)。这就代表着如果存在边\(x\rightarrowz\)和\(y\rightarrowz\),假设存在\(x\Rightarrowy\)那么删去边\(x\r......
  • Python进阶-上下文管理器
    上下文管理器定义包装任意代码确保执行的一致性语法with语句__enter__和__exit__方法classContextManager(object):def__init__(self):self.entered=Falsedef__enter__(self):self.entered=Truereturnself......
  • vue学习第16天 CSS---3D转换 (translate3d 3d移动、3D旋转 rotate3d、transform-
    3D转换转换:1)3d移动 translate3d 2)3d旋转 rotate3d 3D的特点:1)近大远小2)物体后面遮挡不可见 3D转换:我们工作最常用的 3D位移 和 3D旋转 主要知识点: 1、三维坐标系(z轴,z外(屏幕)+,z内(屏幕)-)三维......
  • TensorFlow08 神经网络-keras实战
    1数据集:这个照片很模糊,大小只有[32,32],所以我们预测的结果也不是很好。2自定义网络层(MyDenselayer)原本的网络层:w@x+b然后我们自己定义了一个,特意的把+b去掉了。3数据加载importosos.environ['TF_CPP_MIN_LOG_LEVEL']='2'importtensorflowastffromtensorfl......