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内部的逻辑关系

csharp 复制代码
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 赋值给 calculate1
            Calculate calculate1 = Sub; //定义一个Calculate 类型的calculate1字段, 并将Sub函数传递给它
            Calculate calculate2 = Add; //定义一个Calculate 类型的calculate2字段, 并将Add函数传递给它

            int i = Test(1, 2, calculate1); //返回 1 + (1+2) = 4
            int j = Test(1, 2, calculate2); //返回 1+  (1-2) = 0

            Console.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)

c 复制代码
// 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 赋值给 calculate1
    Calculate calculate1 = Add;

    Calculate calculate2 = Sub;

    int i = Test(1, 2, calculate1); //返回 1 + (1+2) = 4
    int j = Test(1, 2, calculate2); //返回 1+  (1-2) = 0

    printf("i的值是: %d\n", i);
    printf("j的值是: %d\n", j);
}

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

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

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);
    @FunctionalInterface
    interface 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);
    }

    @Test
    void contextLoads() {
        //委托/函数指针的精髓在于, 将委托看作一种类型, 和int, String一样的类型.
        //只不过int a = b; 是将 int类型的变量 b 赋值给 a,
        //而Calculate calculate1 = Sub; 是将Calculate类型的 Sub 赋值给 calculate1
        ICalculate calculate1 = this::Add;
        ICalculate calculate2 = this::Sub;
        Integer i = Test(1,2,calculate1);//返回 1 + (1+2) = 4
        Integer j = Test(1,2,calculate2);//返回 1+  (1-2) = 0

        System.out.println("i的值是:"+i);
        System.out.println("j的值是:"+j);
    }

}
相关推荐
老华带你飞几秒前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
她说彩礼65万6 分钟前
C# lock
c#
在未来等你28 分钟前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈1 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥1 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧
揽你·入怀1 小时前
数据结构:ArrayList简单实现与常见操作实例详解
java·开发语言
okok__TXF1 小时前
SpringBoot3+AI
java·人工智能·spring
AA-代码批发V哥1 小时前
Math工具类全面指南
java·开发语言·数学建模
我不是程序猿儿2 小时前
【C#】Thread.Join()、异步等待和直接join
开发语言·c#
FAREWELL000753 小时前
Unity学习总结篇(1)关于各种坐标系
学习·unity·c#·游戏引擎