一个平凡菜鸟的C#琐碎总结 ---- -委托

 

1、委托:其实就是方法的多态,可以更确切的说是方法的指针

2、委托是引用类型,这与类和接口相似。

3、一个委托可以指向多个方法,方法的签名相同,委托才能指向它

4、接口只能一次可以指向一个实例,而委托可以指向多个方法;此刻调用一个委托可以调用多个方法,也即是委托链

5、使用委托的步骤:

步骤1:声明委托 

        1定义委托:可访问性 delegate 返回类型 (参数列表);
        2定义方法:可访问性 返回类型 (参数列表)

       //以上两点根据参数类型和返回类型进行匹配,必须两者相同才能委托指向方法,也即函数的签名必须相同

   public delegate void Job();

注意:其实委托相当于一个类所以定义委托一定要定义在方法的外面。

步骤2:创建委托调用的方法

  //创建一个类,里面包含两个方法

class School

    {

        public void teacher()

        {

            Console.WriteLine("老师的工作是教学生学习!");

        }

        public void student()

        {

            Console.WriteLine("学生的工作是好好学习!");

        }

}

步骤3:调用委托进而调用指向的方法

      static void Main(string[] args)

        {

            School school = new School();

           Job j = new Job(school.teacher); //实例化委托的时候必须指明其构造函数的参数,该参数不是值,不是引用,而是要指向方法的方法名

          j += new Job(school.student); //继续加入委托链,其实相当于加入到委托数组里面,就像是一个方法数组,即数组里面存储了多个方法

      Console.WriteLine("此刻该委托链中有{0}个方法",j.GetInvocationList().Length);

      // j.GetInvocationList().Length调用委托的一个方法获取委托数组的长度,也即获得委托方法的个数。

          j();

          j -= new Job(school.student); //当然也可以从委托链中减去相应不想用的方法

      Console.WriteLine("此刻该委托链中有{0}个方法", j.GetInvocationList().Length);

       j();

       }

5、委托的广播

使用+=委托中添加一个方法,使用- =使委托中减少一个方法,其实委托链就存在一个委托数组中,数组中存的是方法的引用。+=相当于添加一个委托的引用,-=相当于减少一个委托的引用。

   单路广播:一个委托指向一个方法

多路广播:一个委托指向多个方法

注意:对于单路广播可以使用返回值,而对于多路广播,方法的返回值可能就不知一个,所以一般不建议带返回值,若必须有那么委托接收的是委托链最后的那个方法的返回值。

6、委托类的成员

以下方法可以简单的了解下,是用编程的方式实现委托的创建,添加委托的方法,减去等。

第一次写博客,弄了半天都没有把图片贴上去,这地方是应该插入委托成员的,及其用法解释,可没办法,哎。。。。学校网速还太不给力

想了解的话可以查下msdn,抱歉啊!

7、委托增强

1、匿名方法:字面上讲没有名字的方法,能省略参数列表,意味着可以将匿名方法转换为带有各种签名的委托。可以把代码块传递作为委托的参数,而这个代码块还是相当于原来类里面的一个方法。好处:通过匿名方法不必创建单独的一个方法,创建类,减少了实例化委托所需要的代码系统开销。

如:使用匿名方法实现老师工作的方法。

Job jobdelegate = delegate()

   {

      Console.WriteLine("老师的工作是教学生学习!"); };

   jobdelegate();//使用该委托

仅仅使用一次的方法一般不要写在类里面,避免冗余,再如来个数相加:

   public delegate int Add(int a, int b);//定义委托

   Add add = delegate(int m, int n)

            {

                return m + n;

            };

            int result=add(1,2);

            Console.WriteLine(result);

8、协变和逆变

协变和逆变都是与继承有关系的

(1)协变:允许方法具有的派生返回类型比委托中定义的多,比如说:

定义两个类,男人继承于人类:class people{}; class men:people{};

定义委托:public delegate  people  MethodPeople();

委托可以返回people,也可以返回men;即 MethodPeople  m1=delegate(){return man;};

可以这么简单的理解:委托类型是父类类型,而委托调用方法时方法返回类型可以使子类类型,当然也可以是父类类型。

(2)逆变:允许方法具有派生类参数类型比委托类型中的更少

字面上就能理解是和逆变相反的,说白了就是委托定义的子类类型或者参数为子类类型,而返回的可以使父类类型,或者参数传入的时父类类型。

个人理解:其实这就是方法返回类型和方法参数的多态,仅做参考。

协变和逆变用的地方不是很多,简单了解就行。

注:希望路过的别扔砖头,有错误的还请各位大侠见谅并批评指出!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值