当前位置: 首页 > news >正文

C# 委托函数 delegate

在C#中,委托(Delegate)是一种特殊的类型,它可以持有对方法的引用。
委托是实现事件的基础。事件本质上是多播委托,允许多个方法被触发

委托允许你将方法作为参数传递给其他方法,或者将方法作为返回值从方法返回,或者将方法赋值给变量。(可以用作函数的参数、返回值、给变量赋值)

  • delegate:具有相同签名和返回值类型的有序方法列表
  • 有序方法列表:有序的放入几个函数地址,被称为调用列表
  • 当委托被调用时, 调用列表中的每一个方法
    在这里插入图片描述

和C++的函数指针类似,但委托是面向对象且类型安全的

委托中保存的方法,或者说存入委托中的函数可以来自任何类或结构,只要他们符合委托的定义

  • 返回值
  • 签名(包括ref ,out 修饰符)
    在这里插入图片描述

以下是委托的一些基本概念和用法:

委托的定义和使用

切记委托是一种类型!!!

public delegate int MyDelegate(int x, int y);
public int Add(int x, int y) {return x + y;
}
// 实例化委托
MyDelegate addDelegate = new MyDelegate(Add);
int result = addDelegate(2, 3); // 输出 5

可以理解为,委托的实例化其实是将函数的地址存入委托列表中。
因为一个委托中可以放入多个函数

在这里插入图片描述

为委托增加方法

在这里插入图片描述

用于调用委托的参数将会用于调用-调用列表中的每一个方法,除非有一个参数输出参数

调用带有返回值的委托

在这里插入图片描述

匿名方法

delegate (input parameters)
{code
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
匿名函数有什么用???
为了给委托快速赋值?
有点子多余

Lambda 表达式 – 匿名函数的优化版

C# 3.0 引入了Lambda表达式,它是一种更简洁的语法来定义匿名方法:

在这里插入图片描述

在这里插入图片描述

lambda可以直接转为delegate 类型

在这里插入图片描述

Func - lambda和委托函数的中间商

 public delegate TResult Func<in T, out TResult>(T arg);
//这是一个泛型委托,表示一个接受一个类型为T的参数,并返回一个TResult的函数。Func<TSource, bool> 
//这个泛型委托,接受一个TSource类型的参数并返回一个bool值
//它通常用于定义谓词(Predicate),即一个返回真或假的函数,常用于过滤集合中的元素。

Func是C#的内置泛型委托,以便更加简洁方便的使用委托
这样不用再定义委托-实例化委托。

结合匿名函数Func作为形参,最终传入的实参可以是:
x => x==1 等形式
即 一个传入X参数,返回bool值

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)
  • PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘
  • Google Test 学习笔记(简称GTest)
  • Thinkphp5实现前后端通过接口通讯基本操作方法
  • 特征工程在机器学习中的重要性
  • 【JAVA开发笔记】Reids下载、安装、配置-Windows篇(超详细,含Redis可视化管理工具!!!)
  • LeetCode704 二分查找
  • Docker 搭建GitLab
  • docker centos镜像 npm安装包时报错“npm ERR! code ECONNRESET”
  • windows wsl ubuntu系统安装桌面可视化
  • LeetCode203 移除链表元素
  • 10 Vue 特性要点
  • FineBI连接MySQL5.7
  • SQL 注入漏洞详解 - Union 注入
  • “微软蓝屏事件”深度解析:从系统故障到网络安全的挑战与应对
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【剑指offer】让抽象问题具体化
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 345-反转字符串中的元音字母
  • css属性的继承、初识值、计算值、当前值、应用值
  • Hibernate【inverse和cascade属性】知识要点
  • JS实现简单的MVC模式开发小游戏
  • Laravel 菜鸟晋级之路
  • MySQL主从复制读写分离及奇怪的问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React组件设计模式(一)
  • SSH 免密登录
  • vue-loader 源码解析系列之 selector
  • Xmanager 远程桌面 CentOS 7
  • 第2章 网络文档
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 欢迎参加第二届中国游戏开发者大会
  • 检测对象或数组
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 新手搭建网站的主要流程
  • 一个完整Java Web项目背后的密码
  • 最简单的无缝轮播
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 白色的风信子
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计ssm电影分享网站
  • (回溯) LeetCode 40. 组合总和II
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (四)进入MySQL 【事务】
  • (转)jQuery 基础
  • (转)shell调试方法
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .Mobi域名介绍