iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#中的delegate/event/EventHandler/Action/Func怎么使用
  • 843
分享到

C#中的delegate/event/EventHandler/Action/Func怎么使用

2023-07-05 20:07:57 843人浏览 薄情痞子
摘要

本篇内容主要讲解“C#中的delegate/event/EventHandler/Action/Func怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的delegate/event

本篇内容主要讲解“C#中的delegate/event/EventHandler/Action/Func怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的delegate/event/EventHandler/Action/Func怎么使用”吧!

1 委托

.net中定义“委托”需要用到delegate关键字,它是存有对某个方法的引用的一种引用类型变量,类似于 C 或 c++ 中函数的指针。“委托”主要有两大作用:

(1)将方法当作参数传递

(2)方法的一种多态(类似于一个方法模板,可以匹配很多个方法)

下面,给出一个展现了上述两大作用的委托代码示例:

//定义一个委托        public delegate int MyDelegate(int x, int y);        //与委托匹配的一个方法        public static int Add(int a, int b)        {            return a + b;        }        //与委托匹配的另一个方法        public static int Reduce(int a, int b)        {            return a - b;        }        //示例:将委托/方法当参数传递        public static int Test(MyDelegate MD)        {            return MD(10, 20);        }        static void Main(string[] args)        {            int a, b, x, y;            MyDelegate md;            //将委托指向Add这个方法,并进行相关操作            md = Add;            a = md(1, 2);            b = Test(md);            //再将委托指向Reduce这个方法,并进行相关操作            md = Reduce;            x = md(7, 2);            y = Test(md);            Console.WriteLine($"1+2={a},10+20={b},7-2={x},10-20={y}");            Console.ReadLine();        }

执行以上程序,输出结果如下:

1+2=3,10+20=30,7-2=5,10-20=-10

委托也可以使用+=/-=来实现“发布/订阅”模式,示例代码如下:

//定义一个委托        public delegate void MyDelegate1(int x);        public static void Method1(int a)        {            Console.WriteLine($"a={a}");        }        public static void Method2(int b)        {            Console.WriteLine($"b={b}");        }        static void Main(string[] args)        {            MyDelegate1 md = null;            md += Method1;            md += Method2;            md(35);            Console.ReadLine();        }

以上程序输出如下:

a=35
b=35

但是委托有一个弊端,它可以使用“=”将所有已经订阅的取消,只保留=后的这一个订阅。

为了解决这个弊端,事件event应运而生。

2 事件-概念的引出

事件event是一种特殊的委托,它只能+=,-=,不能直接用=。

event在定义类中(发布者)是可以直接=的,但是在其他类中(订阅者)就只能+= -=了,也就是说发布者发布一个事件后,订阅者针对他只能进行自身的订阅和取消。

下面是定义一个事件的代码:

//定义一个委托        public delegate void MyDelegate1(int x);        //定义一个事件        public event MyDelegate1 emd;

经过长久的经验积累后,人们发现,绝大多数事件的定义,是用public delegate void XXX(object sender, EventArgs e);这样一个委托原型进行定义的,是一件重复性的工作,于是,EventHandler应运而生。它的出现就是为了避免这种重复性工作,并建议尽量使用该类型作为事件的原型。

//@sender: 引发事件的对象//@e: 传递的参数public delegate void EventHandler(object sender, EventArgs e);//使用public event EventHandler emd;

下面给出一个使用事件的具体示例:

public class Demo        {            public event EventHandler emd;            public void RaiseEvent()            {                emd(this, EventArgs.Empty);            }        }        static void Main(string[] args)        {            var instance = new Demo();            instance.emd += (sender, arg) =>            {                Console.WriteLine("执行事件1!");            };            instance.emd += (sender, arg) =>            {                Console.WriteLine("执行事件2!");            };            instance.RaiseEvent();            Console.ReadLine();        }

这里我们先定义一个Demo类,其内部有个事件是emd,我们给他开放了一个接口RaiseEvent,如果谁敢调用它,那么,它就触发报警事件emd。

这里模拟了2个订阅者,分别处理报警事件emd。

程序执行结果如下:

执行事件1!
执行事件2!

同时,我们也可以看出:事件是按照+=的订阅先后顺序执行的。

3 事件-关于异常

现在,我们在第一个订阅者中加入异常,如下:

instance.emd += (sender, arg) =>    {        Console.WriteLine("执行事件1!");        throw new Exception("执行事件1,错误");    };

执行后发现,第1个订阅者事件触发抛出异常后,第2个订阅者的事件没有执行。

可见,如果你想让所有订阅者都执行处理的话,那每个订阅者必须在订阅程序内自己处理好异常,不能抛出来!

4 事件-关于异步

如果事件的订阅者中有一个是“异步”处理,又会是什么情况?

下面我们把第1个订阅者改为异步处理,代码如下:

instance.emd += async (sender, arg) =>    {        Console.WriteLine("执行事件1!");        await Task.Delay(1000);        Console.WriteLine("执行事件1!完毕");    };

执行后输出如下:
执行事件1!

执行事件2!

执行事件1!完毕

可见,异步的事件处理没有阻塞进程,很好的起到了异步方法的作用。

5 委托-Func与Action

本文最开始探讨委托,然后直接顺到了事件的相关话题上。其实,关于委托还有一个重点话题漏掉了,那就是Func与Action。

在委托delegate出现了很久以后,微软的.NET设计者们终于领悟到,其实所有的委托定义都可以归纳并简化成只用Func与Action这两个语法糖来表示。其中,Func代表有返回值的委托,Action代表无返回值的委托。有了它们两,我们以后就不再需要用关键字delegate来定义委托了。

同时,若再用lambda表达式取代被委托指向的具体方法,则整个委托的“定义+赋值”两步将大大简化(lambda表达式本来也是方法定义的一种简化形式)。

下面,把最开始委托章节中关于加减法的程序代码,用Func与lambda表达式进行简化改造,改造后的代码如下:

//示例:将委托/方法当参数传递        public static int Test(Func<int, int, int> MD)        {            return MD(10, 20);        }        static void Main(string[] args)        {            int a, b, x, y;            Func<int, int, int> md;            //将委托指向加法,并进行相关操作            md = (t, v) => t + v;            a = md(1, 2);            b = Test(md);            //再将委托指向减法,并进行相关操作            md = (t, v) => t - v;            x = md(7, 2);            y = Test(md);            Console.WriteLine($"1+2={a},10+20={b},7-2={x},10-20={y}");            Console.ReadLine();        }

到此,相信大家对“C#中的delegate/event/EventHandler/Action/Func怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C#中的delegate/event/EventHandler/Action/Func怎么使用

本文链接: https://www.lsjlt.com/news/355022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中的delegate/event/EventHandler/Action/Func怎么使用
    本篇内容主要讲解“C#中的delegate/event/EventHandler/Action/Func怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中的delegate/event...
    99+
    2023-07-05
  • 详解C#中delegate/event/EventHandler/Action/Func的使用和区别
    目录1 委托2 事件-概念的引出3 事件-关于异常4 事件-关于异步5 委托-Func与Action1 委托 在.NET中定义“委...
    99+
    2023-05-14
    C# delegate C# event C# EventHandler C# Action C# Func
  • C#中Action,Delegate,Func的用法
    本篇内容主要讲解“C#中Action,Delegate,Func的用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中Action,Delegate,Func的用法”吧!以前我都是通过定义一...
    99+
    2023-06-15
  • c# delegate和event的使用说明
    delegate是什么 委托(delegate) 是存有对某个方法的引用的一种引用类型变量,引用可在运行时被改变。如果不好理解,可以把委托理解成为函数指针,但它们是有区别的。 del...
    99+
    2024-04-02
  • C#中delegate怎么用
    小编给大家分享一下C#中delegate怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!C#语言有很多值得学习的地方,这里我们主要介绍C# delegate,包括介绍Windows Message数量的变量成本等方面。...
    99+
    2023-06-17
  • 浅谈C#中Action和Func回调的常用方式
    目录一、简介二、Action例1例2三、Func例1例2结束一、简介 Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性。基本涵盖...
    99+
    2024-04-02
  • func在c语言中怎么用
    func是c语言中用于声明和定义函数的关键字。func声明的格式为return_type func_name(parameter_list);,func定义的格式为return_type...
    99+
    2024-05-10
    c语言
  • html中action怎么使用
    这篇文章主要讲解了“html中action怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“html中action怎么使用”吧!html中action是...
    99+
    2024-04-02
  • jQuery的delegate()函数怎么使用
    jQuery的delegate()函数用于将事件绑定到被选元素的子元素上,即可以绑定动态生成的元素。delegate()函数的语法如...
    99+
    2023-09-08
    jQuery
  • C#中的EventHandler观察者模式怎么实现
    这篇文章主要介绍“C#中的EventHandler观察者模式怎么实现”,在日常操作中,相信很多人在C#中的EventHandler观察者模式怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中的Eve...
    99+
    2023-06-29
  • vuex中store的action和mutations怎么使用
    本文小编为大家详细介绍“vuex中store的action和mutations怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vuex中store的action和mutations怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
    99+
    2023-06-30
  • Vue中的event对象怎么用
    本文小编为大家详细介绍“Vue中的event对象怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue中的event对象怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、什么是event对象event...
    99+
    2023-06-29
  • Vuex中怎么使用action传入多个参数
    Vuex中怎么使用action传入多个参数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。解决办法:将第二个参数以对象的放式提交...
    99+
    2024-04-02
  • Python之Pygame的Event事件模块怎么使用
    Pygame的Event事件模块事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如常用的鼠标点击、键盘敲击、游戏窗口移动、调整窗口大小、触发特定的情节、退出游戏等,这些都可以看做是“事件”。 事件类型Pyg...
    99+
    2023-05-18
    Python Pygame event
  • C/C++中的#define怎么使用
    这篇文章主要介绍“C/C++中的#define怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C/C++中的#define怎么使用”文章能帮助大家解决问题。1.数值类型输出易读的字符串形式例如...
    99+
    2023-07-05
  • c#中的LINQ怎么使用
    这篇文章主要介绍“c#中的LINQ怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“c#中的LINQ怎么使用”文章能帮助大家解决问题。一.并行LINQSystem.Linq名称空间中包含的类Pa...
    99+
    2023-06-30
  • C#中的Mixin怎么使用
    这篇文章主要介绍“C#中的Mixin怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C#中的Mixin怎么使用”文章能帮助大家解决问题。从一个简单例子说起试想我们在写一个游戏引擎,创建如下类:...
    99+
    2023-06-30
  • C++中的string怎么使用
    在C++中,可以使用string类来处理字符串。首先,需要包含头文件。以下是一些常用的string操作:1. 声明和初始化strin...
    99+
    2023-08-17
    C++ string
  • C#中的IntPtr怎么使用
    这篇文章主要介绍“C#中的IntPtr怎么使用”,在日常操作中,相信很多人在C#中的IntPtr怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中的IntPtr怎么使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • 怎么使用C++中的list
    本篇内容主要讲解“怎么使用C++中的list”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用C++中的list”吧!构造的使用构造函数的使用主要有4个,分别如下list()构造空的list...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作