个人资料

主页 博客 留言板 搜索
跳过导航链接首页 > 博客列表 > 博客正文

C#基础学习难点突破,从delegete委托开始说起

分类

系列目录:

0.从delegete委托开始说起

1.委托和事件绑定

2.泛型委托

3.委托和多线程

4.委托和async/await异步等待





委托 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.当正在实现的方法链接到类的类型或标识时:例如比较方法。

这么看,委托似乎并不难,但和委托有关的东西太多了,能够牵出一大片知识点,冰山一小角而已,这也是从委托开始谈起的原因.






songshizhao
最初发表2018/6/13 12:56:14 最近更新2018/6/13 12:56:14 444
为此篇作品打分
10