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");
}
复制代码

优点

将方法的引用封装在委托的对象中(把过程的调用转化为对象的调用,充分体现了委托加强了面向对象的编程思想),委托对象给需要引用的方法,在编译时不用知道调用的那个方法,使得方法的声明和方法的使用分离。

posted @   frace  阅读(221)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示