C#高级 03委托

1.delegate委托定义

委托需要先定义后使用

csharp 复制代码
delegate void IntMethodInvoker(int x);

定义了一个委托InMethodInvoker,这个委托可以指向一个带一个int

类型参数,返回值为void的方法

2.Action委托和Func委托

Action委托引用了一个void返回类型的方法,T表示方法参数,先看Action委托有那些

csharp 复制代码
Action
Action<in T>
Action<in t1,in t2>
Action<in t1,in t2,···,t16>

Func引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回值类型

csharp 复制代码
Func<out TResult>
Func<in t,out TResult>
Function<in t1,in t2,···,in t16,out TResult>

3.多播委托

前面是用的委托都只包含一个方法调用,但是委托也可以包含多个方法,这种委托叫做多播委托。使用多播委托可以按照顺序调用多个方法,多播委托只能得到调用的最后一个方法结果,一般我们把多播委托的返回值类型声明为viod。

csharp 复制代码
Action action1 = Test1;
action2 += Test2;
action2 -= Test1;

//遍历多播委托
Delegate[] delegates = action1.GetInvocationList();
foreach (Delegate d in delegates) 
{
    d.DynamicInvoke();
}

多播委托包含一个逐个调用的委托集合,如果通过委托调用的其中一个方法抛出异常,整个迭代就会停止。取得多播委托中所有方法的委托

4.另一种委托定义方式

前面使用委托都是先定义一个方法,然后把方法给委托的实例。但还有另外一种使用委托的方式,不用去定义一个方法,应该说是使用匿名方法(方法没有名字)

csharp 复制代码
Func<int,int,int> plus = delegate(int a, int b)
{
  int temp = a+b;
  return temp;
}
int res = plus(34,34)
Console.WriteLine(res);

//上述代码可以换成下面一行
Func<int, int, int> plus = (a, b) => { return a + b; };

Lambda表达式外部变量

通过Lambda表达式可以访问Lambda表达式外部的变量,这是一个非常好的功能,但是如果不能正确使用,也会非常危险。

相关推荐
Elastic 中国社区官方博客5 分钟前
Observability:当 YAML 遇上 IConfiguration:OpenTelemetry .NET SDK 的声明式配置
大数据·开发语言·elasticsearch·搜索引擎·全文检索·.net
郑州光合科技余经理7 分钟前
同城商城源码:商品库和订单库怎么随包交付
android·java·开发语言·后端·uni-app·php·ai编程
welfare96220 分钟前
新号别搞:C++_list
开发语言·c++
数据狐(Datafox)21 分钟前
一文读懂京东商品详情 API:返回字段解读与 JSON 样例
开发语言·数据库·爬虫·json
坤坤子吖32 分钟前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习
damoluomu32 分钟前
国产 Java CMS 的协议和坑,讲清楚
java·开发语言
Wang's Blog40 分钟前
Java 项目实战: 交友项目 - 黑名单:分页查询黑名单
java·开发语言·交友
mklpo14743 分钟前
python3:如何按照实际执行需求导入模块,而不是启动时统一导入?(Python3.15)。2026-10-20
开发语言·人工智能·python
蚰蜒螟44 分钟前
从 Java write 到磁盘扇区:一次写入操作的完整内核穿越之旅
java·开发语言
en.en..1 小时前
volatile 关键字整理(嵌入式 C 标准)
java·开发语言