当前位置: 首页 > 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);}}
http://www.lryc.cn/news/151118.html

相关文章:

  • 华为云物联网平台微信小程序开发教程2.0【完整详细教程】
  • Laravel 模型1对1关联 1对多关联 多对多关联 ⑩①
  • 【分类】分类性能评价
  • M1 Pro 新芯片安装python2 方案汇总
  • 无涯教程-Android - Broadcast Receivers
  • 【Pytorch】Tutorials个人翻译集合
  • WordPress(6)网站侧边栏倒计时进度小工具
  • uniapp小程序单页面改变手机电量,头部通知的颜色效果demo(整理)
  • 数据挖掘导论学习笔记1(第1 、2章)
  • 从零开始,探索C语言中的字符串
  • Ubuntu学习---跟着绍发学linux课程记录(第二部分)
  • React18 新特性
  • HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力
  • 音频基本知识
  • 小程序中如何给会员卡设置到期时间
  • Cookie与Session的区别及如何选择
  • 【快手小玩法-弹幕游戏】开发者功能测试报告提交模板
  • 微信小程序在线阅读系统微信小程序设计与实现
  • 【OpenCV入门】第七部分——图像的几何变换
  • 淘宝app商品详情原数据接口API(支持高并发请求/免费测试)
  • JS中的new操作符
  • 文件编辑器、用户管理,嘎嘎学
  • Java获取当前类名的两种方法
  • windows系统开机自启打开指定网页
  • Java-HashMap中put()方法是如何实现的,内含详细流程图
  • kaggle赛后总结
  • 基于Vue前端框架构建BI应用程序
  • 【文心一言】学习笔记
  • Xilinx UltraScale架构之可配置逻辑块CLB
  • springboot web开发整合Freemarker 模板引擎