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

【编程语言】委托与函数指针

委托与函数指针的相似之处:

  1. 指向方法:C# 的委托和 C++ 的函数指针都可以用来指向一个方法或函数。
  2. 调用方法:它们都可以通过引用(委托或函数指针)来调用指向的方法。

委托与函数指针的主要区别:

  1. 类型安全

    • C++ 函数指针:C++ 的函数指针没有类型安全检查,你可以把一个不匹配的函数地址赋值给一个函数指针变量,这样可能会导致运行时错误。
    • C# 委托:C# 的委托是类型安全的。它会确保只能指向与委托签名匹配的方法,这样避免了很多运行时错误。

    例如:

    delegate int MyDelegate(int a, int b);
    
    MyDelegate del = Add; // Add 方法必须符合 MyDelegate 的签名
    
  2. 多播委托

    • C++ 函数指针:C++ 中的函数指针通常指向单个函数或方法,如果你想调用多个函数,通常需要使用函数指针数组或者额外的机制来模拟。
    • C# 委托:C# 的委托支持多播,即一个委托可以调用多个方法(链式调用)。你可以将多个方法添加到一个委托中,然后依次调用这些方法。

    例如:

    delegate void MyDelegate(string msg);
    
    MyDelegate del = Method1;
    del += Method2; // 现在委托可以调用 Method1 和 Method2
    
    del("Hello");
    
  3. 灵活性与支持的特性

    • C++ 函数指针:C++ 的函数指针通常与函数签名紧密关联,且不支持指向类成员函数(除非使用特定的技巧和语法)。
    • C# 委托:C# 的委托可以指向静态方法、实例方法、甚至是匿名方法和 lambda 表达式。这使得 C# 的委托更加灵活和强大。

    例如:

    delegate int MyDelegate(int a, int b);
    
    MyDelegate del = (x, y) => x + y; // 使用 lambda 表达式
    
    Console.WriteLine(del(3, 4)); // 输出 7
    
  4. 事件与委托

    • C++ 函数指针:C++ 中没有内建的事件机制,你需要自己手动管理函数指针的注册和调用。
    • C# 委托:C# 中的委托与事件机制紧密结合,使得在 C# 中使用事件(例如 UI 事件、回调函数等)变得非常方便。事件本质上是委托的一种特殊用法。

示例对比:

C++ 中的函数指针:
#include <iostream>

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    int (*funcPtr)(int, int); // 函数指针声明

    funcPtr = add; // 将指针指向 add 函数
    std::cout << funcPtr(5, 3) << std::endl; // 输出 8

    funcPtr = subtract; // 更改指针指向 subtract 函数
    std::cout << funcPtr(5, 3) << std::endl; // 输出 2

    return 0;
}
C# 中的委托:
using System;

delegate int MathOperation(int a, int b); // 委托声明

class Program {
    static int Add(int a, int b) {
        return a + b;
    }

    static int Subtract(int a, int b) {
        return a - b;
    }

    static void Main() {
        MathOperation operation = Add; // 委托指向 Add 方法
        Console.WriteLine(operation(5, 3)); // 输出 8

        operation = Subtract; // 委托指向 Subtract 方法
        Console.WriteLine(operation(5, 3)); // 输出 2
    }
}

小结:

  • 函数指针是 C++ 中的一种底层特性,它可以指向函数,但缺乏类型安全,并且不具备多播等更高级的功能。
  • 委托是 C# 中的高级特性,提供了类型安全、多播和更灵活的功能,适用于更广泛的应用场景。

虽然 C# 的委托和 C++ 的函数指针有类似的作用,但委托比函数指针更强大、更安全且更易于使用。

相关文章:

  • Java 中 HTTP 协议版本使用情况剖析
  • 数字后端实现之Innovus中open net原因解析及解决方案
  • 硬编码(二)经典定长指令二
  • 自然语言处理NLP 04案例——苏宁易购优质评论与差评分析
  • Vue 和 React 的异同点
  • TTL和CMOS的区别【数电速通】
  • web网站接入Google Analytics
  • 晶闸管的串联使用
  • PyTorch-基础(CUDA、Dataset、transforms、卷积神经网络、VGG16)
  • python入门到精通,python入门基础语法,小白python入门教程
  • MySQL数据库(7)—— 内置函数
  • Screen Wonders for Mac v3.3.1 3D屏保应用 支持M、Intel芯片
  • spring笔记
  • ollama如何安全卸载,解决Ollama unins000.msg is missing
  • HTML 中的 Canvas 样式设置全解
  • LLM基础概念(RAG、微调流程、Prompt)
  • 【愚公系列】《Python网络爬虫从入门到精通》025-进程间通信
  • 网络运维学习笔记 017HCIA-Datacom综合实验01
  • pytest运行用例的常见方式及参数
  • 【登月计划】 DAY2 中期:产品研发与设计验证(4-6)--《设计图纸如何从电脑飞进生产线?揭秘研发系统的 “暗箱操作”》
  • 哪些网站做批发衣服/福州网站排名
  • 阿里巴巴国际站可以做网站吗/保定seo推广公司
  • 网站外链建设工作计划/个人网页设计作品模板
  • 网店代运营具体做什么/引擎优化seo怎么做
  • 网站开发语言为wap/网站seo技术教程
  • 报价网站制作/培训机构