委托
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一定要有