C#委托有几种类型,分别适合什么使用场景

来源:AI社区作者:新井头衔:网络博主
导读:本期聚焦于小伙伴创作的《C#委托有几种类型,分别适合什么使用场景》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#委托有几种类型,分别适合什么使用场景》有用,将其分享出去将是对创作者最好的鼓励。

C#委托是一种类型安全的函数指针,用于封装方法引用,开发者可以根据使用需求选择不同类型的委托。C#中的委托主要分为自定义委托、Action委托、Func委托、Predicate委托这几种类型,每种类型都有其特定的使用场景。

C#委托有几种类型,分别适合什么使用场景

C#委托的主要类型

1. 自定义委托

自定义委托是开发者根据自身的业务需求手动定义的委托类型,需要明确指定委托的参数列表和返回值类型。定义自定义委托需要使用delegate关键字,定义后就可以创建该委托的实例,绑定对应的方法。

自定义委托适合需要特定参数和返回值格式的场景,比如需要封装带多个参数、或者返回值类型不是常规类型的场景。

// 定义自定义委托,无参数无返回值
public delegate void MyCustomDelegate();
// 定义带两个int参数,返回string的自定义委托
public delegate string MyCalcDelegate(int a, int b);

class Program
{
    static void PrintHello()
    {
        Console.WriteLine("Hello");
    }

    static string Add(int x, int y)
    {
        return (x + y).ToString();
    }

    static void Main()
    {
        // 创建自定义委托实例并绑定方法
        MyCustomDelegate del1 = PrintHello;
        del1(); // 输出 Hello

        MyCalcDelegate del2 = Add;
        string result = del2(3, 5);
        Console.WriteLine(result); // 输出 8
    }
}

2. Action委托

Action委托是C#内置的委托类型,位于System命名空间下,它封装的方法没有返回值。Action委托有多个重载版本,支持0到16个输入参数,开发者可以根据需要传递对应数量的参数。

Action委托适合封装不需要返回结果的方法,比如执行一些操作、输出日志、修改状态等场景。

using System;

class Program
{
    static void PrintNum(int num)
    {
        Console.WriteLine($"当前数字是:{num}");
    }

    static void PrintSum(int a, int b)
    {
        Console.WriteLine($"两数之和是:{a + b}");
    }

    static void Main()
    {
        // 无参数的Action
        Action action1 = () => Console.WriteLine("无参数Action执行");
        action1();

        // 带1个int参数的Action
        Action<int> action2 = PrintNum;
        action2(10);

        // 带2个int参数的Action
        Action<int, int> action3 = PrintSum;
        action3(3, 7);
    }
}

3. Func委托

Func委托同样是C#内置的委托类型,位于System命名空间下,它封装的方法必须有返回值。Func委托的最后一个泛型参数表示返回值类型,前面的泛型参数表示输入参数,支持0到16个输入参数。

Func委托适合封装需要返回结果的方法,比如计算数值、获取数据、处理字符串等场景。

using System;

class Program
{
    static int Multiply(int a, int b)
    {
        return a * b;
    }

    static string GetName()
    {
        return "张三";
    }

    static void Main()
    {
        // 无参数,返回string的Func
        Func<string> func1 = GetName;
        string name = func1();
        Console.WriteLine(name); // 输出 张三

        // 带2个int参数,返回int的Func
        Func<int, int, int> func2 = Multiply;
        int product = func2(4, 6);
        Console.WriteLine(product); // 输出 24
    }
}

4. Predicate委托

Predicate委托是C#内置的委托类型,位于System命名空间下,它封装的方法接收一个输入参数,返回值为bool类型。Predicate委托本质上是一种特殊的Func委托,等价于Func<T, bool>,但语义更明确,专门用于判断条件。

Predicate委托适合封装条件判断的方法,常用于集合的筛选操作,比如List的Find、FindAll方法的参数就经常使用Predicate委托。

using System;
using System.Collections.Generic;

class Program
{
    static bool IsEven(int num)
    {
        return num % 2 == 0;
    }

    static void Main()
    {
        Predicate<int> isEvenPredicate = IsEven;
        List<int> nums = new List<int> { 1, 2, 3, 4, 5, 6 };
        // 使用Predicate筛选偶数
        List<int> evenNums = nums.FindAll(isEvenPredicate);
        foreach (int n in evenNums)
        {
            Console.WriteLine(n); // 输出 2 4 6
        }
    }
}

不同类型委托的选择建议

在实际开发中,选择委托类型可以遵循以下原则:

  • 如果需要的方法参数和返回值不符合内置委托的格式,或者需要更明确的语义,选择自定义委托。
  • 如果封装的方法没有返回值,优先选择Action委托,减少自定义委托的定义成本。
  • 如果封装的方法有返回值,优先选择Func委托,根据参数数量和返回值类型选择对应的泛型版本。
  • 如果是条件判断场景,需要返回bool值,优先选择Predicate委托,语义更清晰,也符合很多内置方法的参数要求。

合理使用不同类型的委托,可以让代码更简洁,可读性更强,也能减少不必要的重复代码定义。

C#委托ActionFuncPredicate自定义委托修改时间:2026-06-29 19:12:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。