.NET/C#高级进阶合集视频-委托

委托

1)介绍:实质上是一个类,通过ILSpy中间语言查看,可明确知道!它定义了委托方法的返回类型和参数列表,使得可以将方法当作另一个方法的参数来进行传递。可用来隐藏目标方法,可减少重复代码,代码复用。
简单工厂属于创建型,关心的是对象创建而非方法使用。委托则关心方法使用而非对象创建
2)实现
//委托可以定义在类内部也可以在外部
public delegate void DelegateInt(int num);
class MyDelegate
{
//需要委托方法一定要与定义的委托一样,参数列表和返回类型一样。
public void returnInt(int n)
{
Console.WriteLine(n);
}
}

```
//声明目标需要委托的类,以便使用
        MyDelegate myDelegate = new MyDelegate();

        //使用需要委托的方法实例化委托
        DelegateInt delegateInt = new DelegateInt(myDelegate.returnInt);

        //调用委托方法
        delegateInt(123)//前面是简写或者delegateInt.Invoke(123)

```
</code></pre>

3)泛型委托
    <code>//定义
      public delegate T DataDelegate<T>();</code>

<pre><code>  DataDelegate<int> dataDelegate = new Ticket12306.DataDelegate<int>(ticket12306.GetYuPiao);
                dataDelegate.Invoke();

                DataDelegate<bool> dataDelegate2 = new Ticket12306.DataDelegate<bool>(ticket12306.IsHasTicket);
                dataDelegate2.Invoke();

                DataDelegate<User> dataDelegate3 = new Ticket12306.DataDelegate<User>(ticket12306.GetUser);
                dataDelegate3.Invoke();
</code></pre>

4)委托多播(如需要使用返回值,使用最后一个委托方法的返回值)
  ```
  //定义
  public delegate void TickitDelegaete();
        public delegate T DataDelegate
   
   
    
    ();
        public void SaleTicket()
        {
            Console.WriteLine("12306出票咯");
        }


    
    
public int GetYuPiao()
    {
        Console.WriteLine("还有100张票");
        return 100;
    }

    public int GetTuiPiao()
    {
        Console.WriteLine("现在有24张退票");
        return 100;
    }


//使用
Ticket12306 ticket12306 = new Ticket12306();

DataDelegate<int> dataDelegate = new Ticket12306.DataDelegate<int>(ticket12306.GetYuPiao);
 dataDelegate += ticket12306.GetTuiPiao;//还可以使用-=
 dataDelegate.Invoke();//这里一次性执行上面委托的两个方法,按定义顺序执行

5)实践使用
//飞猪卖票12306(可解藕)
//创建目标委托所在的对象
Ticket12306 ticket12306 = new Ticket12306();

//创建委托
            TickitDelegaete tickitDelegaete = new TickitDelegaete(ticket12306.SaleTicket);

            //调用第三方类方法执行(放在第三方解藕)
            TicketPig ticketPig = new TicketPig();
            ticketPig.SaleTicket(tickitDelegaete);

```
6)委托的其他写法:
1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);//常规写法
2、委托 委托名 =会调用的方法名; 委托名(参数); //上面的简写
3、匿名方法:委托 委托名=delegate(参数){会调用的方法体};委托名(参数);
4、拉姆达表达式:委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);
5、用Action 和Func //Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托。
a)Action<T1,T2....T16>,表示无返回值的委托类型,T参数个数是16个内不定
b)和Func<T1,T2....T16,TResult>表示最多一个返回值的委托类型,T参数个数是16个内不定,但TResult一定要有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值