前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C Sharp(八)

C Sharp(八)

作者头像
1ess
发布于 2021-11-01 08:11:07
发布于 2021-11-01 08:11:07
3270
举报
文章被收录于专栏:0x7c00的专栏0x7c00的专栏

C Sharp(八)

發佈於 2018-10-31

这一篇,我们讲讲 C# 中特殊的委托(delegate)。

概述


委托和类一样,都是用户定义类型。类表示数据和方法的集和,而委托则是持有一个或多个方法,以及一系列预定义操作。

我们通过以下步骤来使用委托:

  • 声明一个委托,委托的声明看上去和方法声明类似,只是没有实现块
  • 使用委托类型声明一个委托变量
  • 创建委托类型的变量,赋值为委托变量,这个委托类型变量指向方法的引用,这个方法和委托定义的签名和返回值类型一样
  • 可以为委托对象增加其他方法
  • 可以像调用方法一样调用委托,调用委托时,其包含的每一个方法都会被执行

声明委托

delegate void MyDel(int x);

创建委托对象

有两种方式创建委托对象:

  • 第一种是使用 new 操作符的创建表达式,参数是调用列表第一个方法的名字

delVal = new MyDel(instance.MyM1); //实例方法 dVal = new MyDel(SClass.OtherM2); //静态方法

  • 我们还可以使用快捷语法,直接赋值为方法名即可

delVal = instance.MyM1; dVal = SClass.OtherM2;

为委托增加方法

我们使用 += 操作符为委托增加方法。

MyDel del = inst.M1; del += SCl.M3; del += X.Act;

同样使用 -= 从委托移除方法。

调用委托

我们可以像调用方法一样调用委托:

MyDel del = inst.M1; del += SCl.M3; del += X.Act; //... del(444);

调用带有返回值的委托

  • 调用列表最后一个方法返回的值就是委托返回值
  • 调用列表的其他方法返回值将被忽略

delegate int MyDel(); class MyCls { public int IntVal = 5; public int Add2() { IntVal += 2; return IntVal; } public int Add3() { IntVal += 3; return IntVal; } } class Program { static void Main() { MyCls cls = new MyCls(); MyDel del = new MyDel(cls.Add2); del += cls.Add3; del += cls.Add2; Console.WriteLine(del()); //12 { }

调用带引用参数的委托

再调用方法列表的下一个方法时,参数的新值会传给下一个方法。

delegate void MyDel(ref int x); class MyCls { public void Add2(ref int x) { x += 2; } public void Add3(ref int x) { x += 3; } } class Program { static void Main() { MyCls cls = new MyCls(); MyDel del = new MyDel(cls.Add2); del += cls.Add3; del += cls.Add2; int x = 5; del(ref x); Console.WriteLine(x); //12 } }

Lambda 表达式

我们可以使用 Lambda 表达式创建委托对象。 C# 中的 Lambda 表达式与 JavaScript 中的很像。如果只有一个参数,可以省略括号,如果只有一个返回值语句,可以省略大括号和 reuturn 关键字。

MyDel del = (int x) => { return x + 1; }; //简写形式 MyDel del = x => x + 1;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《C#图解教程》读书笔记之五:委托和事件
  (1)本质:持有一个或多个方法的对象;委托和典型的对象不同,执行委托实际上是执行它所“持有”的方法。如果从C++的角度来理解委托,可以将其理解为一个类型安全的、面向对象的函数指针。
Edison Zhou
2018/08/20
5830
《C#图解教程》读书笔记之五:委托和事件
C#委托使用详解(Delegates)
摘要 委托是C#编程一个非常重要的概念,也是一个难点。本文将系统详细讲解委托。 1. 委托是什么? 其实,我一直思考如何讲解委托,才能把委托说得更透彻。说实话,每个人都委托都有不同的见解,因为看问题的角度不同。个人认为,可以从以下2点来理解: (1) 从数据结构来讲,委托是和类一样是一种用户自定义类型。  (2) 从设计模式来讲,委托(类)提供了方法(对象)的抽象。 既然委托是一种类型,那么它存储的是什么数据? 我们知道,委托是方法的抽象,它存储的就是一系列具有相同签名和返回回类型的方法的地址。调用委托的
刘皓
2018/04/03
1.4K0
C#2.0新增功能03 匿名方法
  在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。 C# 2.0 引入匿名方法,在 C# 3.0 及更高版本中,Lambda 表达式取代匿名方法作为编写内联代码的首选方式。 但是,本主题中有关匿名方法的信息也适用于 Lambda 表达式。 在有一种情况下,匿名方法提供 Lambda 表达式中没有的功能。 使用匿名方法可省略参数列表。 这意味着匿名方法可转换为具有多种签名的委托。 Lambda 表达式无法实现这一点。 有关 Lambda 表达式的详细信息,请参阅 Lambda 表达式。
张传宁IT讲堂
2019/09/17
5670
C Sharp(九)
很多程序都会有一个需求: 当一个特定事件发生时,程序的其他部分可以得到这个事件发生的通知。 发布者/订阅者模式可以满足这个需求: 发布者定义了一系列事件,其他类可以注册某些事件,以便在事件发生时,订阅者可以收到通知响应事件。订阅者注册事件时提供的方法称为回调函数或者事件处理程序。
1ess
2021/11/01
5460
C#-委托与事件
委托:是一个类、是一种数据类型 定义语法: 访问修饰符 关键字(delegate) 返回值 标识符(参数列表) 委托的绑定:和委托的返回值一样,参数一样的方法都可以绑定到此委托 委托链的使用:通过+=、-=给委托链添加和删除一个绑定方法。 委托使用之前需要先定义 三种使用方式: 1.直接方法赋值使用 2.匿名函数使用: 匿名函数法:delagate + 参数 + 方法体{return 返回值默认值;} 3.Lambda表达式使用: 格式:(参数)=>{} 当只有一个参数,一个返回值的时候,写Lambda表达式时,可以将参数的小括号、参数的类型省略,将方法大括号,return语句的return也省略,语句后的分号也可以省略。
祝你万事顺利
2019/05/29
4170
C#基础篇 - 理解委托和事件
委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做参数传递的类型。很多情况下,某个函数需要动态地去调用某一类函数,这时候我们就在参数列表放一个委托当做函数的占位符。在某些场景下,使用委托来调用方法能达到减少代码量,实现某种功能的用途。
Esofar
2018/09/05
5630
C#基础篇 - 理解委托和事件
WPF开发-委托(delegate)
官方文档:https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2010/ms173171(v=vs.100)
码客说
2021/10/18
2.1K0
委托学习过程及委托、Lambda表达式和匿名方法的关系总结及事件总结
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
wfaceboss
2019/04/08
6430
不惧面试:委托
v博客前言 先交代下背景,写这篇博客的原因是一些常用的知识点得温故而知新。第二个原因是之前看过一些书,写过一些代码,但是没有总结下来,下次再写code的时候,发现有点茫然,所以决定将此知识点总结下来
悟空聊架构
2018/05/18
8660
C#使用BeginInvoke实现异步编程
BeginInvoke方法是委托(Delegate)类的一个成员,它允许你在一个新的线程中异步执行方法。它通常用于执行长时间运行的操作,以确保主线程保持响应性。
郑子铭
2023/10/23
1.2K0
C#使用BeginInvoke实现异步编程
C Sharp(十二)
没有泛型的时候,我们封装的行为都是作用在特定类型上的,但是,很多时候如果我们把行为提取或重构出来,使其可以应用到很多类型上去的话,那么就会更有意义。这也是泛型出现的原因。
1ess
2021/11/01
8910
每个.NET开发都应掌握的C#委托事件知识点
上篇文章讲述了C#接口的知识点,本文将介绍C#委托事件知识点。C#作为.NET开发的核心语言之一,提供了丰富的特性来支持面向对象编程和事件驱动的模型。其中,委托和事件是C#中不可或缺的关键概念,每个.NET开发者都应该深入理解它们的作用和用法。委托和事件密不可分,所以本文将委托和事件的知识点一起介绍,并通过一些示例来帮助开发者更好地掌握这些重要的概念。
郑子铭
2023/08/30
3230
每个.NET开发都应掌握的C#委托事件知识点
泛型委托学习进程
(1)     委托声明(定义一个函数原型:返回值+参数类型和个数)注:在类的外部——中介(房产中介商)
wfaceboss
2019/04/08
2830
C# Lambda表达式详解,及Lambda表达式树的创建
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。我眼中的程序员大多都不爱说话,默默承受着编程的巨大压力,除了技术上的交流外,他们不愿意也不擅长和别人交流,更不乐意任何人走进他们的内心!
zls365
2021/02/26
9560
什么是委托?
关键字 delegate 返回值类型 委托名字([数据类型 变量],[数据类型 变量],...);
静心物语313
2020/03/24
5210
C#学习笔记 委托
有时候可能想要将一个方法传递给另一个方法。在C++中使用函数指针来实现,在JavaScript中由于函数也是对象所以直接可以在参数列表中传递。而在C#中需要使用委托。
乐百川
2022/05/05
2940
C# Lambda
Lambda表达式实际上是一种匿名函数,在Lambda表达式中可以包含语句以及运算等操作。并且可用于创建委托或表达式目录树类型,支持带有可绑定到委托或表达式树的输入参数的内联表达式。使用Lambda表达式可大大减少代码量,使得代码更加的优美、简洁,更有可观性。
张哥编程
2024/12/13
580
C# Lambda
C# 语言中Lambda(拉姆达) 表达式介绍
Lambda 表达式是一种可用于创建 委托 或 表达式目录树 类型的 匿名函数 。 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 Lambda 表达式对于编写
程序你好
2018/07/20
8.5K0
【C++】lambda表达式语法详细解读(代码演示,要点解析)
YY的秘密代码小屋
2024/01/23
4490
C# 学习笔记(12)—— Lambda 表达式
Lambda 表达式是 C# 3.0 中最重要的特性之一,另外一个同样重要的特性是 Linq
Karl Du
2023/10/20
2970
相关推荐
《C#图解教程》读书笔记之五:委托和事件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档