在C#中,委托(Delegate)是一种特殊的类型
,它可以持有对方法的引用。
委托是实现事件的基础。事件本质上是多播委托,允许多个方法被触发
委托允许你将方法作为参数传递给其他方法,或者将方法作为返回值从方法返回,或者将方法赋值给变量。(可以用作函数的参数、返回值、给变量赋值)
- delegate:具有相同签名和返回值类型的有序方法列表
- 有序方法列表:有序的放入几个函数地址,被称为调用列表
- 当委托被调用时, 调用列表中的每一个方法
和C++的函数指针类似,但委托是面向对象且类型安全的
委托中保存的方法,或者说存入委托中的函数可以来自任何类或结构,只要他们符合委托的定义
- 返回值
- 签名(包括ref ,out 修饰符)
以下是委托的一些基本概念和用法:
委托的定义和使用
切记委托是一种类型!!!
public delegate int MyDelegate(int x, int y);
public int Add(int x, int y) {return x + y;
}
// 实例化委托
MyDelegate addDelegate = new MyDelegate(Add);
int result = addDelegate(2, 3); // 输出 5
可以理解为,委托的实例化其实是将函数的地址存入委托列表中。
因为一个委托中可以放入多个函数
为委托增加方法
用于调用委托的参数将会用于调用-调用列表中的每一个方法,除非有一个参数输出参数
调用带有返回值的委托
匿名方法
delegate (input parameters)
{code
}
匿名函数有什么用???
为了给委托快速赋值?
有点子多余
Lambda 表达式 – 匿名函数的优化版
C# 3.0 引入了Lambda表达式,它是一种更简洁的语法来定义匿名方法:
lambda可以直接转为delegate 类型
Func - lambda和委托函数的中间商
public delegate TResult Func<in T, out TResult>(T arg);
//这是一个泛型委托,表示一个接受一个类型为T的参数,并返回一个TResult的函数。Func<TSource, bool>
//这个泛型委托,接受一个TSource类型的参数并返回一个bool值
//它通常用于定义谓词(Predicate),即一个返回真或假的函数,常用于过滤集合中的元素。
Func是C#的内置泛型委托,以便更加简洁方便的使用委托
这样不用再定义委托-实例化委托。
结合匿名函数Func作为形参,最终传入的实参可以是:
x => x==1 等形式
即 一个传入X参数,返回bool值