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

2分钟讲清楚C#的委托, C语言的函数指针,Java的函数式接口

很多小伙伴学习C# 的委托时往往一头雾水, 不明白委托是什么, 有什么作用, 今天我就用2分钟讲清楚

这是一个C# 的控制台程序
定义一个最简单的委托 delegate int Calculate(int a, int b);

这相当于定义了一个Calculate类型, 只不过这个类型需要传入2个int类型的参数
返回值也是int

委托的意义在于, 它可以将函数封装成可以像变量 int, string这样的类型传入到另外的函数中, 例如函数int Test(int a, int b, Calculate c)
这大大提高了函数的功能和可扩展性, 可以在不改变Test函数的参数的同时,
通过改变Calculate 来改变Test内部的逻辑关系

namespace DelegateTest
{public class Program{//定义一个Calculate 类型的委托delegate int Calculate(int a, int b); static void Main(string[] args){//定义一个返回值和参数都与Calculate相同的加法函数int Add(int a, int b){return a + b;}//定义一个返回值和参数都与Calculate相同的减法函数int Sub(int a, int b){return a - b;}//将委托类型calculate当参数传入函数int Test(int a, int b, Calculate calculate){return calculate(a, b) + a;}//委托的精髓在于, 将委托看作一种类型, 和int, String一样的类型.//只不过int a = b; 是将 int类型的变量 b 赋值给 a, //而Calculate calculate1 = Sub; 是将Calculate类型的 Sub 赋值给 calculate1Calculate calculate1 = Sub; //定义一个Calculate 类型的calculate1字段, 并将Sub函数传递给它Calculate calculate2 = Add; //定义一个Calculate 类型的calculate2字段, 并将Add函数传递给它int i = Test(1, 2, calculate1); //返回 1 + (1+2) = 4int j = Test(1, 2, calculate2); //返回 1+  (1-2) = 0Console.WriteLine("i的值是:" + i);Console.WriteLine("j的值是:" + j);}}}

很多人不知道, C# 的委托, 和C语言的函数指针是一个东西

我们把C sharp的 delegate int Calculate(int a, int b)
换成C语言的 typedef int (*Calculate)(int a, int b)

// FunctionPoint.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <stdio.h>//定义一个Calculate 类型的委托//delegate int Calculate(int a, int b); typedef int (*Calculate)(int a, int b);//定义一个返回值和参数都与Calculate相同的加法函数int Add(int a, int b){return a + b;}//定义一个返回值和参数都与Calculate相同的减法函数int Sub(int a, int b){return a - b;}//将委托类型calculate当参数传入函数int Test(int a, int b, Calculate calculate){return a + calculate(a, b);}int main()
{//委托/函数指针的精髓在于, 将委托看作一种类型, 和int, String一样的类型.//只不过int a = b; 是将 int类型的变量 b 赋值给 a, //而Calculate calculate1 = Sub; 是将Calculate类型的 Sub 赋值给 calculate1Calculate calculate1 = Add;Calculate calculate2 = Sub;int i = Test(1, 2, calculate1); //返回 1 + (1+2) = 4int j = Test(1, 2, calculate2); //返回 1+  (1-2) = 0printf("i的值是: %d\n", i);printf("j的值是: %d\n", j);
}

可以运行一下, 这两个程序返回的结果是一样的. 如果放在java 上怎么实现?

函数式接口和委托, 函数指针是一脉相承的!

package com.example.design;import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class DesignApplicationTests {//定义一个Calculate 类型的委托//delegate int Calculate(int a, int b);//typedef int (*Calculate)(int a, int b);@FunctionalInterfaceinterface ICalculate{Integer Calculate (Integer a, Integer b);}//定义一个返回值和参数都与Calculate相同的加法函数Integer Add(Integer a, Integer b){return a + b;}//定义一个返回值和参数都与Calculate相同的减法函数Integer Sub(Integer a, Integer b){return a - b;}//将委托类型calculate当参数传入函数Integer Test(Integer a, Integer b, ICalculate iCalculate){return a + iCalculate.Calculate(a, b);}@Testvoid contextLoads() {//委托/函数指针的精髓在于, 将委托看作一种类型, 和int, String一样的类型.//只不过int a = b; 是将 int类型的变量 b 赋值给 a,//而Calculate calculate1 = Sub; 是将Calculate类型的 Sub 赋值给 calculate1ICalculate calculate1 = this::Add;ICalculate calculate2 = this::Sub;Integer i = Test(1,2,calculate1);//返回 1 + (1+2) = 4Integer j = Test(1,2,calculate2);//返回 1+  (1-2) = 0System.out.println("i的值是:"+i);System.out.println("j的值是:"+j);}}

相关文章:

2分钟讲清楚C#的委托, C语言的函数指针,Java的函数式接口

很多小伙伴学习C# 的委托时往往一头雾水, 不明白委托是什么, 有什么作用, 今天我就用2分钟讲清楚 这是一个C# 的控制台程序 定义一个最简单的委托 delegate int Calculate(int a, int b); 这相当于定义了一个Calculate类型, 只不过这个类型需要传入2个int类型的参数 返回值也…...

华为云物联网平台微信小程序开发教程2.0【完整详细教程】

一、简介 在之前曾发布过一篇文章“华为云物联网平台的微信小程序开发”&#xff0c;在最近接到部分用户私信在使用开发过程中出现的问题&#xff0c;例如API访问的"401"现象等问题&#xff0c;在重新查看上面的文章教程时发现教程内容的步骤不详细&#xff0c;现对教…...

Laravel 模型1对1关联 1对多关联 多对多关联 ⑩①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…...

【分类】分类性能评价

评价指标 1、准确率、召回率、精确率、F-度量、ROC ​ 属于各类的样本的并不是均一分布&#xff0c;甚至其出现概率相差很多个数量级&#xff0c;这种分类问题称为不平衡类问题。在不平衡类问题中&#xff0c;准确率并没有多大意义&#xff0c;我们需要一些别的指标。 ​ 通…...

M1 Pro 新芯片安装python2 方案汇总

前言&#xff1a;磨刀不误砍柴工&#xff0c;环境装好&#xff0c;才能打工。M1 Pro 新芯片安装python2 文章目录 方案一 docker 容器构造环境&#xff08;如果涉及本地两个仓库需要关联则不适用&#xff09;方案二 使用 pyenv &#x1f680; 作者简介&#xff1a;作为某云服务…...

无涯教程-Android - Broadcast Receivers

Broadcast Receivers 仅响应来自其他应用程序或系统本身的广播消息&#xff0c;这些消息有时称为events或intents。例如&#xff0c;应用程序还可以启动广播&#xff0c;以使其他应用程序知道某些数据已下载到设备并可供他们使用&#xff0c;因此广播接收器将拦截此通信并启动适…...

【Pytorch】Tutorials个人翻译集合

本文记录Pytorch Tutorials文档的翻译文章集合. 由于本人英语能力有限&#xff08;only-CET4&#xff09;&#xff0c;欢迎指正翻译中的错误。 Introduction to PyTorch 【Pytorch】Pytorch文档学习1&#xff1a;Tensors 【Pytorch】Pytorch文档学习2&#xff1a;DATASETS &a…...

WordPress(6)网站侧边栏倒计时进度小工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 效果图在这里插入图片描述一、添加位置二、主题style.css文件中添加美化1.引入库2.添加自定义的HTML模块效果图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 在主题中 child.js…...

uniapp小程序单页面改变手机电量,头部通知的颜色效果demo(整理)

onShow(){ // 改变电池的颜色 wx.setNavigationBarColor({ frontColor: ‘#ffffff’, //只支持两种颜色 backgroundColor: ‘#ffffff’, animation: { duration: 1 } }) }...

数据挖掘导论学习笔记1(第1 、2章)

参考&#xff1a;https://blog.csdn.net/u013232035/article/details/48281659?spm1001.2014.3001.5506 和《数据挖掘导论》学习笔记&#xff08;第1-2章&#xff09;_时机性样本_schdut的博客-CSDN博客 第1章 绪论 数据挖掘是一种技术&#xff0c;它将传统的数据分析方法…...

从零开始,探索C语言中的字符串

字符串 1. 前言2. 预备知识2.1 字符2.2 字符数组 3. 什么是字符串4. \04.1 \0是什么4.2 \0的作用4.2.1 打印字符串4.2.2 求字符串长度 1. 前言 大家好&#xff0c;我是努力学习游泳的鱼。你已经学会了如何使用变量和常量&#xff0c;也知道了字符的概念。但是你可能还不了解由…...

Ubuntu学习---跟着绍发学linux课程记录(第二部分)

文章目录 7 文件权限7.1 文件的权限7.2 修改文件权限7.3 修改文件的属主 8、可执行脚本8.2Shell脚本8.3python脚本的创建 9Shell9.1Shell中的变量9.2 环境变量9.3用户环境变量 学习链接: Ubuntu 21.04乌班图 Linux使用教程_60集Linux课程 所有资料在 http://afanihao.cn/java …...

React18 新特性

React18 新特性 自动批量更新State 定义 import { useState } from reactconst [x, setX] useState(0)渲染赋值 setX(5)并发CM模式 同步不可中断更新机制 -> 异步可中断并行 状态更新 机制 React18 默认开启并发模式 详见代码 ReactDOM 的引入 import ReactDOM fr…...

HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力

一. 样例介绍 本篇Codelab基于自适应布局和响应式布局&#xff0c;实现购物应用在手机、折叠屏、平板不同屏幕尺寸设备上按不同设计显示。通过三层工程结构组织代码&#xff0c;实现一次开发&#xff0c;多端部署 。 手机运行效果如图所示&#xff1a; 折叠屏运行效果图&#x…...

音频基本知识

声音传播方式: 1)声音的传播需要介质,在真空中不能传播; 2)声波属于纵波,即如下图传播方向与振动方向一致; 声音速度: 1)常温常压下,一般空气速度为340m/s; 2)温度越高,声速越大; 3)液体、固体的传播速度比空气快; 人耳可接收到的频域范围: 1)通常范围…...

小程序中如何给会员卡设置到期时间

通过设置会员卡到期时间&#xff0c;可以有效地管理会员卡的使用周期&#xff0c;提供更好的会员服务体验。下面将介绍一种常见的给会员卡设置到期时间的方法。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要设置到期时间的会员卡。也支持对会员卡按…...

Cookie与Session的区别及如何选择

目录 Cookie Session 如何选择 在网站开发中&#xff0c;Cookie与Session是两种常见的数据管理方式&#xff0c;它们在不同情况下有各自的优势和劣势。在这篇文章中&#xff0c;我们将深入了解Cookie与Session之间的区别&#xff0c;并提供了一些建议&#xff0c;帮助您在实…...

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求&#xff0c;准入和准出更加严格&#xff0c;要求有明确的测试报告。格式如下&#xff1a; *本文参考字节wiki&#xff1a;CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐&#xff1a;【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…...

微信小程序在线阅读系统微信小程序设计与实现

摘 要&#xff1a;信息技术永远是改变生活的第一种创新方式&#xff0c;各种行业的发展更是脱离不了科技化的支持。原本传统的行业正在被科技行业的切入悄悄的发生变化。就拿我们生活当中常见的事情举例而言&#xff0c;在外卖行业还没有发展的快速的时候&#xff0c;方便面等速…...

【OpenCV入门】第七部分——图像的几何变换

文章结构 缩放dsize参数实现缩放fx参数和fy参数实现缩放 翻转仿射变换平移旋转倾斜 透视cmath模块 缩放 通过resize()方法可以随意更改图像的大小比例&#xff1a; dst cv2.resize(src, dsize, fx, fy, interpolation)src&#xff1a; 原始图像dsize&#xff1a; 输出图像的…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...