优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#中的委托搞懂了(c#委托的实现)

nanyue 2025-04-30 18:37:06 技术文章 3 ℃

1 什么是委托?

委托是C#中的一种引用类型,它用来存储和调用方法,功能类似于C++中的函数指针,但在类型安全性和灵活性上更强大。

1.1 C++函数指针的基本语法

#include <iostream>
using namespace std;

// 一个简单的函数,接收一个整数参数并打印它
void PrintNumber(int number)
{
    cout << "The number is: " << number << endl;
}

int main()
{
    // 定义一个函数指针,指向接收一个整数参数并返回 void 的函数
    void (*funcPtr)(int);

    // 将 PrintNumber 函数的地址赋值给函数指针
    funcPtr = PrintNumber;

    // 使用函数指针调用 PrintNumber 函数
    funcPtr(5);  // 输出: The number is: 5

    return 0;
}

1.2. 委托的基本语法

// 定义一个委托类型
public delegate void MyDelegate(string message);

// 定义一个与委托签名匹配的方法
public void ShowMessage(string message)
{
    Console.WriteLine(message);
}

// 使用委托
MyDelegate del = ShowMessage;
del("Hello, Delegates!");  // 输出: Hello, Delegates!

1.1.2. 为什么使用委托?

优点

解释

示例

回调机制

将委托做为参数传递,并调用该委托

异步操作完成后通知主程序。

事件处理

常用于处理事件响应。

处理按钮点击事件。

灵活性

使代码更灵活,可动态绑定和解绑方法。

可以随时更改调用的方法。

可扩展性

允许动态添加或删除方法,增强程序功能。

运行时修改方法逻辑。

解耦

将方法调用者与被调用者分离,减少依赖,提高模块化。

不同模块间通过委托通信,降低耦合度。

1.1.3. 多播委托

多播委托可以同时引用多个方法,并依次调用这些方法。

public delegate void MyDelegate(string message);

public class Program
{
    public static void ShowMessage(string message)
    {
        Console.WriteLine("Message: " + message);
    }

    public static void LogMessage(string message)
    {
        Console.WriteLine("Log: " + message);
    }

    public static void Main()
    {
        MyDelegate del = ShowMessage; // 添加第一个方法
        del += LogMessage;            // 添加第二个方法
        del("Hello, Multi-cast Delegates!"); // 依次调用 ShowMessage 和 LogMessage
    }
}

// 输出:
// Message: Hello, Multi-cast Delegates!
// Log: Hello, Multi-cast Delegates!

1.1.4. 内置委托

C# 提供了几个常用的内置委托,简化了委托的使用:

委托类型

描述

示例

Action

不返回值,有 0 到多个参数。

Action<string> action = ShowMessage; action("Hello, Action!");

Func

有返回值,有 0 到多个参数。

Func<int, int, int> func = (a, b) => a + b; int result = func(3, 4); // 返回 7

Predicate

返回 bool,有一个参数。

Predicate<int> predicate = x => x > 10; bool isGreater = predicate(15); // 返回 true

using System;

public class Program
{
    public static void Main()
    {
        // 使用 Action 示例
        Action<string> action = ShowMessage;
        action("Hello, Action!");  // 输出: Hello, Action!

        // 使用 Func 示例
        Func<int, int, int> func = (a, b) => a + b;
        int result = func(3, 4); // 返回 7
        Console.WriteLine("Func result: " + result);  // 输出: Func result: 7

        // 使用 Predicate 示例
        Predicate<int> predicate = x => x > 10;
        bool isGreater = predicate(15); // 返回 true
        Console.WriteLine("Predicate result: " + isGreater);  // 输出: Predicate result: True
    }

    // ShowMessage 方法
    public static void ShowMessage(string message)
    {
        Console.WriteLine(message);
    }
}
最近发表
标签列表