zoukankan      html  css  js  c++  java
  • 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、委托类的成员

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

    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)逆变:允许方法具有派生类参数类型比委托类型中的更少

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

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

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

  • 相关阅读:
    恢复误删的进程在使用的文件
    Linux系统CPU频率调整工具使用
    ubuntu opencv的使用
    ubuntu14.04 安装PCL
    boost 错误报告
    Ubuntu 查看软件版本
    Ubuntu14.04下安装glog
    PCL 编译中遇到 error C4996: 'pcl::SAC_SAMPLE_SIZE'
    EXE DLL等可执行程序添加版本号版权等信息
    ubuntu16.04中将python3设置为默认
  • 原文地址:https://www.cnblogs.com/fuchongjundream/p/2306013.html
Copyright © 2011-2022 走看看