C# 委托(一个方法的形参,是另一个方法,lambda表达式)

介绍

委托是C#中的一种类型,允许将方法作为参数传递给其他方法,实现回调、事件处理和动态调用等功能。

官方网址:
https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/delegates/

一句话解释

相当于 JavaScript 的回调函数

例子

由于写法比较与众不同,所以这里用简单例子说明写法、用法,没有实际意义

声明委托类型(在类的内部、外部声明都行)

public delegate void StdDel();

定义委托方法1

在类内部定义

关键:委托方法的 形参、返回值 必须与委托类型相同

public static void Std()
{
    Console.WriteLine("学习委托1");
}

实例化委托

实例化委托,传入 Std,不带 ()

static void Main(string[] args)
{
    StdDel del = new StdDel(Std);// 实例化委托,传入std
}

使用委托方式1

使用委托对象调用方法

static void Main(string[] args)
{
    StdDel del = new StdDel(Std);// 实例化委托,传入std
    del(); // 使用委托对象调用方法

    Console.ReadKey();
}

委托的多播(Multicasting of a Delegate)

委托对象可使用 + 运算符进行合并,这被称为委托的 多播(multicasting),也叫组播。

注意:只有相同类型的委托可被合并。

应用场景

调用委托时,可以执行多个方法

合并委托例子

定义委托方法2

在类内部定义

关键:委托方法的 形参、返回值 必须与委托类型相同

public static void Std2()
{
    Console.WriteLine("学习委托2");
}

执行

使用委托对象调用方法

static void Main(string[] args)
{
    StdDel del = new StdDel(Std);// 实例化委托,传入std
    del += Std2
    del(); // 使用委托对象调用方法Std()、Std2()

    Console.ReadKey();
}

移除委托

委托对象可使用 - 运算符可用于从合并的委托中移除组件委托

例子

static void Main(string[] args)
{
    StdDel del = new StdDel(Std);// 实例化委托,传入std
    del += Std2
    del(); // 使用委托对象调用方法Std()、Std2()

    del -= Std2 // 移除 Std2
    del(); // 使用委托对象调用方法Std()

    Console.ReadKey();
}

使用委托方式2

委托作为参数,传入另一个函数

定义执行函数

在类内部定义

关键: 形参 是上面声明的 委托类型

public static void Test(StdDel del)
{
    del();// 执行委托
}

执行

调用 Test() 方法,传入 委托实例

static void Main(string[] args)
{
    StdDel sd = new StdDel(Std);// 实例化委托,传入std
    Test(sd); // 委托作为参数,传入另一个函数

    Console.ReadKey();
}

使用委托方式3

委托方法作为参数,传入另一个函数(不需要实例化委托)

执行

static void Main(string[] args)
{
    Test(Std);// 执行时,将委托方法作为参数传进去

    Console.ReadKey();
}

匿名委托

详见:
https://www.malaoshi.top/show_1GWjLNYvhaS.html

lambda表达式

详见:
https://www.malaoshi.top/show_1GWjLNYvhaS.html

https://blog.csdn.net/COCO56/article/details/103644594