系列目录:
1.委托和事件绑定
2.泛型委托
3.委托和多线程
委托 delegete,字面意思就是请别人帮忙.
首先为什么要使用委托?
委托比较像指向方法的指针。在C#,你已经看不见指针了。举个例子,如果把委托定义成类的一个属性,其实他代表的是方法.方便理解,看下面的例子:
namespace Turtual
{
// 定义一个委托(快递员):一个快递员代表的不是一个人,而是代表他背后所能执行的方法
// 即可以理解快递员是一个送快递的解决方案
public delegate string DeliveryMan(string address, string phoneNumber);
// 一个快递公司
public class DeliveryCompany
{
// 这个快递公司很穷,只有一个快递员
public DeliveryMan deliveryMan { get; set; }
public DeliveryCompany()
{
// 快递公司决定了他们的快递员如何去送快递
// 注意方法后不要有括号
deliveryMan = SendMail;
}
// 这个快递员很懒惰
public string SendMail(string address, string phoneNumber)
{
return "我们公司快倒闭了,不给你送快递";
}
}
//另一家快递公司
public class SuperDeliveryCompany
{
// 这个快递公司也有一个快递员,超人先生
public DeliveryMan superMan { get; set; }
public SuperDeliveryCompany()
{
// [超级快递公司]决定了他们的快递员如何去送快递
superMan += ConfirmMail;
superMan += ReportMail;
superMan += SendMail;
}
// 超人说什么也要把你的快递送到火星去
public string ConfirmMail(string address, string phoneNumber)
{
string r = "请确认这是你要送的快递,请放心,我是超人,为了显示我的能力,不管是什么快递,我都要把快递送到火星去!";
Debug.WriteLine(r);
return r;
}
public string ReportMail(string address, string phoneNumber)
{
string r = "你要送的快递在前往火星途中...";
Debug.WriteLine(r);
return r;
}
public string SendMail(string address, string phoneNumber)
{
string r = "快递已送达火星!";
Debug.WriteLine(r);
return r;
}
}
}
委托的运算,即事件订阅
注意上面的例子,当我给超人superman这个委托赋值方法的时候,使用了+=这个运算符.这里要介绍委托的运算,当使用+=运算符的时候,委托可以代表执行多个方法.当我们执行委托的时候,多个方法依次执行,也可称之为订阅方法.同时取消订阅方法可用-=运算符.测试一下委托的执行,看下面的代码:
namespace Turtual { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); Test(); } public void Test() { SuperDeliveryCompany super = new SuperDeliveryCompany(); super.superMan.Invoke("地址", "138xxx"); //还可以在外面再次添加绑定方法,绑定一个lamd表达式匿名方法 super.superMan += (address,phoneNumber) => {Debug.WriteLine("Lamd"); return ""; }; super.superMan.Invoke("地址", "138xxx"); } } }
注意,委托还可以在外面注入方法,注意上面的代码.superman先生被我召唤了两次,第二次我在外面又绑定了一个lamd匿名方法.可以看到,这时候委托的使用方式和接口功能就很接近.
接口相关文章:https://www.songshizhao.com/blog/blogPage/475.html
委托和接口都允许类设计器分离类型声明和实现。 任何类或结构都能继承和实现给定的接口。 可以为任何类上的方法创建委托,前提是该方法符合委托的方法签名。 接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。 既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢?微软官方文档是这么说的:
A在以下情况下,请使用委托:
1.当使用事件设计模式时。
2.当封装静态方法可取时。
3.当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。
4.需要方便的组合。
5.当类可能需要该方法的多个实现时。
B在以下情况下,请使用接口:
1.当存在一组可能被调用的相关方法时。
2.当类只需要方法的单个实现时。
3.当使用接口的类想要将该接口强制转换为其他接口或类类型时。
4.当正在实现的方法链接到类的类型或标识时:例如比较方法。
这么看,委托似乎并不难,但和委托有关的东西太多了,能够牵出一大片知识点,冰山一小角而已,这也是从委托开始谈起的原因.