C# 里这 7 个创建委托的方法,你知道几个?

Coding-148

前言

嗨,大家好!

委托是一种强大的工具,可以让你将方法作为参数传递。

在 C# 中,创建委托有多种方法,每种方法都有其特点和适用场景。

我总结了 7 个创建委托的方法,看看有没有你不知道的方法?

1. 使用 delegate 关键字

这是最基本的创建委托的方法,通过 delegate 关键字定义一个委托类型

using System;

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

class Program
{
    static void Main()
    {
        // 创建委托实例
        MyDelegate myDelegate = new MyDelegate(Method1);
        
        // 添加另一个方法到委托
        myDelegate += Method2;

        // 调用委托
        myDelegate();
    }

    static void Method1()
    {
        Console.WriteLine("Method1 called");
    }

    static void Method2()
    {
        Console.WriteLine("Method2 called");
    }
}

2. 使用 Func 泛型委托

C# 提供了内置的泛型委托 Func 委托,它可以简化创建能够返回值的方法委托

using System;

class Program
{
    static void Main()
    {
        // 定义一个 Func 委托,接受两个 int 参数,返回一个 int
        Func<int, int, int> add = Add;

        // 调用委托
        int result = add(10, 5);
        Console.WriteLine(result); // 输出: 15
    }

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

Func 委托可以接受最多16个参数,最后一个类型参数是方法的返回值。

3. 使用 Action 泛型委托

C# 提供了内置的泛型委托 Action 委托,它可以简化创建不返回任何值的方法委托

using System;

class Program
{
    static void Main()
    {
        // 定义一个 Action 委托,接受一个 string 参数
        Action<string> greet = Greet;

        // 调用委托
        greet("World"); // 输出: Hello, World
    }

    static void Greet(string name)
    {
        Console.WriteLine($"Hello, {name}");
    }
}

Func 委托一样,Action 委托也可以接受最多16个参数

4. 使用匿名方法

匿名方法允许你在定义委托时直接编写方法体,而不需要单独定义一个方法。

示例
using System;

class Program
{
    static void Main()
    {
        // 定义一个委托类型
        delegate void MyDelegate();

        // 使用匿名方法创建委托实例
        MyDelegate myDelegate = delegate
        {
            Console.WriteLine("Anonymous method called");
        };

        // 调用委托
        myDelegate();
    }
}

5. 使用 Lambda 表达式

Lambda 表达式是匿名方法的简化形式,语法更简洁,使用更方便。

示例
using System;

class Program
{
    static void Main()
    {
        // 定义一个 Action 委托,接受一个 string 参数
        Action<string> greet = name => Console.WriteLine($"Hello, {name}");

        // 调用委托
        greet("World"); // 输出: Hello, World
    }
}

6. 使用方法组转换

直接将一个符合委托签名的方法名赋值给委托变量,不需要显式地使用 new 关键字

public delegate void MyDelegate(string message);

public class Program
{
    public static void Main()
    {
        // 直接将方法名赋值给委托
        MyDelegate del = PrintMessage;
        del("你好,通过方法组转换创建的委托!");
    }

    public static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }
}

7. 多播委托

多播委托(multicast delegates)是一种特殊的委托类型,允许一个委托引用多个方法,在调用委托时,依次执行所有引用的方法。

在创建多播委托时,通过 += 操作符将多个方法添加到一个委托中。

public delegate void MyDelegate(string message);

public class Program
{
    public static void Main()
    {
        MyDelegate del = PrintMessage;
        del += AnotherMessage; // 添加第二个方法
        del("你好,多播委托!"); // 调用所有注册的方法
    }

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

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

需要注意的是,如果多播委托有返回值,那么返回值将是最后一个方法的返回值。在应用中,建议将多播委托用于void类型的返回值的场景,以避免返回最后一个方法的结果。

总结

通过上述几种方法,你可以灵活地创建和使用委托。

  • delegate 关键字:适用于需要自定义委托类型的情况。
  • FuncAction 泛型委托:适用于标准的委托需求,语法简洁。
  • 匿名方法:适用于简单的、一次性的委托。
  • Lambda 表达式:语法简洁,适用于简单的委托。
  • 方法组转换:适用于直接将方法赋值给委托的情况。
  • 多播委托:适用于需要依次调用多个方法的情况,比如在 WinForms 中单击按钮处理多个任务。

好了,今天的分享就到这里啦,如果觉得有用,别忘了点个【赞与在看】哦,你的支持是我最大的动力!

最后,如果你有更好的想法或建议,欢迎留言讨论!

往期精彩

  1. 把 C# 里的 HttpClient 封装起来,告别复杂的配置,让 Restful API 调用更轻松更高效
  2. C#12 中 5 个节省你开发时间的的改进
  3. C# 静态类,高手不想让你知道的 15 个真相
  4. 封装一个 C# 范围判断函数,从此告别重复编写范围判断代码的烦恼
  5. 用 C# Stopwatch 计时,让代码性能飞起来!
  6. 轻装上阵,Visual Studio LocalDB:.NET 程序员的本地数据库神器
  7. 封装一个C#万能基础数据类型转换器,一招解决所有基础类型转换烦恼
  8. 闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?
  9. 常用的 4 种 ORM 框架(EF Core,SqlSugar,FreeSql,Dapper)对比总结
  10. C# AutoMapper 10个常用方法总结
  11. C# 7个方法比较两个对象是否相等
  12. C# 去掉字符串最后一个字符的 4 种方法

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎点击下方卡片关注老杨的公众号(名称:代码掌控者),更多干货等你来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值