什么是委托

5 篇文章 0 订阅

1.委托是什么?

  委托本质上是一个类,继承自System.MulticastDelegate,里面内置了几个方法。

注意:委托传递的方法的返回值和参数,必须与委托一致,声明的委托可以放在类里面,也可以放在类外面。

2.委托三部曲

 //声明委托

   public delegate void NoReturnNoPara<T>(T t);
   public delegate void NoReturnNoPara();
   public delegate void NoReturnWithPara(int x, int y);//1 声明委托
   public delegate int WithReturnNoPara();

   public delegate string WithReturnWithPara(out int x, ref int y);

//委托实例化

   NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);

//委托的调用

   method.Invoke();
   method();

3.异步调用与带返回值的委托

WithReturnNoPara method = new WithReturnNoPara(this.GetSomething);//实例化
 int iResult = method.Invoke();//带返回值的委托调用
 iResult = method();
var result = method.BeginInvoke(null, null);//异步调用

method.EndInvoke(result);

4.多播委托

 //多播委托:一个变量保存多个方法,可以增减;invoke的时候可以按顺序执行
 //+= 为委托实例按顺序增加方法,形成方法链,Invoke时,按顺序依次执行
    Student studentNew = new Student();
     NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
     method += new NoReturnNoPara(this.DoNothing);
     method += new NoReturnNoPara(DoNothingStatic);
     method += new NoReturnNoPara(Student.StudyAdvanced);
     method += new NoReturnNoPara(new Student().Study);//不是同一个实例,所以是不同的方法
     method += new NoReturnNoPara(studentNew.Study);
     method.Invoke();

    //method.BeginInvoke(null, null);//多播委托是不能异步的
                foreach (NoReturnNoPara item in method.GetInvocationList())
                {
                    item.Invoke();
                    //item.BeginInvoke(null, null);
                }
     //-= 为委托实例移除方法,从方法链的尾部开始匹配,遇到第一个完全吻合的,移除且只移除一个,没有也不异常
      method -= new NoReturnNoPara(this.DoNothing);
      method -= new NoReturnNoPara(DoNothingStatic);
      method -= new NoReturnNoPara(Student.StudyAdvanced);
      method -= new NoReturnNoPara(new Student().Study);
      method -= new NoReturnNoPara(studentNew.Study);

      method.Invoke();


5.多播委托带返回值

 WithReturnNoPara method = new WithReturnNoPara(this.GetSomething);
  method += new WithReturnNoPara(this.GetSomething2);
  method += new WithReturnNoPara(this.GetSomething3);

  int iResult = method.Invoke();//多播委托带返回值,结果以最后的为准



6.委托的意义

逻辑解耦,在特定的场景,可以提炼出公共逻辑封装,将不同部分的逻辑当参数传递。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值