C#委托
定义什么是委托
说起委托,你可能对委托有个直观的概念,只是无法清楚地表达。每个人对于委托的理解也不同,结合实际使用情况,委托定义了方法的类型,可以指向方法的数据类型。将方法作为另一个方法的参数进行传递。
简单的委托4个部分组成
1.声明委托类型
2.为委托操作对应的方法
3.创建委托实例
4.调用委托实例
//1声明委托 public delegate void MyDel(string name); //2为委托操作对应的方法 public void Say(string name) { Console.WriteLine($"{name} say Hi"); } //3创建委托实例 MyDel myDel = new MyDel(Say); //4调用委托实例 myDel.Invoke("zhangsan");
委托的本质
我们通过反编译工具来看一下 定义的委托
public delegate void MyDel(string name);
编译器把我们定义委托编译成这样
声明的委托相当于一个类,定义了四个方法,一个构造方法,一个Invoke方法,还有两个处理异步BeginInvoke和EndInvoke方法。
泛型委托
c#内置了两个泛型委托 一是无返回值的Action和有返回值的Func
Action委托至少0个参数,至多16个参数,无返回值。
Action 表示无参,无返回值的委托。
Action<int,string> 表示有传入参数int,string无返回值的委托。
Action<int,string,bool> 表示有传入参数int,string,bool无返回值的委托。
Action<int,int,int,int> 表示有传入4个int型参数,无返回值的委托。
Func至少0个输入参数,至多16个输入参数,根据返回值泛型返回。必须有返回值,不可void。
Func<int> 表示没有输入参参,返回值为int类型的委托。
Func<object,string,int> 表示传入参数为object, string ,返回值为int类型的委托。
Func<object,string,int> 表示传入参数为object, string, 返回值为int类型的委托。
Func<T1,T2,,T3,int> 表示传入参数为T1,T2,,T3(泛型),返回值为int类型的委托。
委托的调用
调用分为两种 一种同步调用Invoke,另一种异步调用BeginInvoke
{//同步调用 Action<string> action = Say; action.Invoke("张三"); } {//异步调用 Action<string> asyncAction = Say; asyncAction.BeginInvoke("张三", null, null); }
深入解析 BeginInvoke
该方法参数不确定,最少两个参数,即方法没有参数。倒数第二个参数为一个有参数无返回值的委托,表示执行完后的回调,倒数第一个参数为倒数第二参数回调的参数,用AsyncState来接受,其他参数为方法参数
{//参数说明:前面几个参数都是方法的参数,倒数第二个为异步调用的回调函数,倒数第一个为传给回调函数的参数 Action<string> action = Say; IAsyncResult asyncResult = action.BeginInvoke("张三" , t => { Console.WriteLine($"我是方法{t.AsyncState}的回调"); } , "action"); }
优点
将方法的引用封装在委托的对象中(把过程的调用转化为对象的调用,充分体现了委托加强了面向对象的编程思想),委托对象给需要引用的方法,在编译时不用知道调用的那个方法,使得方法的声明和方法的使用分离。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)