zoukankan      html  css  js  c++  java
  • 如鹏网 net高级技术 第二章 委托和事件(复习)

    委托

      委托是一种数据类型,可以声明委托类型变量。

      委托是一种可以指向方法的数据类型。

      声明委托的方式:delegate返回值类型 委托类型名(参数)    比如  delegate void MyDel(int n)

      注意这里的除了前面的delegate,剩下部分和声明一个函数一样,但是Mydel不是函数名,而是委托类型名

      如何创建委托类型的对象:

        MyDel sp = new Mydel (SayHello) //SayHello需要和MyDel的参数返回值一样;

          sp这个委托变量就指向SayHello这个方法。

          注意不要写成new Mydel (SayHello())因为加上()就是调用方法了

      简化的方法:MyDel sp = SayHello;//编译器会给搞成new Mydel (SayHello),反编译看看。

            注意不要写成MyDel sp = SayHello();

      委托的使用:委托变量之间可以互相赋值,就是一个传递指向方法的过程;sp()就是调用指向的方法,如果有参数就传递参数。

      委托:是一种指向方法的数据类型。 声明的语法:delegate int MyDel2(int i,string s); MyDel2是一个数据类型;

           可以声明一个变量指向和他类型相容的方法

                   public delegate void MyDel(int n);

                  static void M1(int a) { Console.WriteLine("M1"+a); }

                   MyDel d1 = new MyDel(M1);//声明MyDel类型的变量,指向一个指向M1方法的对象 //上面的代码也可以简化成MyDel d1 = M1;

         不要把: MyDel d1 = new MyDel(M1); MyDel d1 = M1;

        声明成: MyDel d1 = new MyDel(M1()); MyDel d1 = M1();

        因为加上括号就代表调用方法了! 拿到一个委托变量的时候MyDel d1 = M1;

         加上括号就代表“执行指向的方法”,参数该怎么传递怎么传递 委托是引用类型,

        可以为null,如果委托变量是null,那么如果调用的话,就会抛出NullReferenceException;

    Func、Action

      .Net中内置两个泛型委托Func、Action(在“对象浏览器”的mscorlib的System下),

      日常开发中基本不用自定义委托类型了。

       Func是有返回值的委托;

      Action是没有返回值的委托

      试验一下用Func、 Action代替之前的委托

    匿名方法

      使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。

       匿名方法就是没有名字的方法。 MyDelegate p = delegate(int s){s=10;};

       用匿名方法改造MyMax的例子。

    lambda表达式

      函数式编程,在Entity framework编程中用的很多

      1、Action<int> a1 = delegate(int i) { Console.WriteLine(i); }; 可以简化成(=>读作goes to):

      2、Action<int> a2 = (int i) => { Console.WriteLine(i); }; 还可以省略参数类型(编译器会自动根据委托类型推断):

      3、Action<int> a3 = (i) => { Console.WriteLine(i); }; 如果只有一个参数还可以省略参数的小括号(多个参数不行) Action<int> a4 = i => { Console.WriteLine(i); };

      4、如果委托有返回值,并且方法体只有一行代码,这一行代码还是返回值,那么就可以连方法的大括号和return都省略:

        Func<int, int, string> f1 = delegate(int i, int j) { return "结果是" + (i + j); }; Func<int,int,string> f2= (i,j)=>"结果是"+(i+j);

      5、普通匿名类型也是一样用lambda表达式

    委托深入

      集合常用扩展方法:

        Where(支持委托)、Select(支持委托)、Max、Min、OrderBy

         First(获取第一个,如果一个都没有则异常)

         FirstOrDefault(获取第一个,如果一个都没有则返回默认值)

         Single (获取唯一一个,如果没有或者有多个则异常)

        SingleOrDefault (获取唯一一个,如果没有则返回默认值,如果有多个则异常)

         关于orderby、关于where的深入分析 ToList、ToArray

    委托的组合

      委托对象可以“+相加”,调用组合后的新委托对象会依次调用被组合起来的委托:MyDel m5 = m1+m2+m3;

      组合的委托必须是同一个委托类型

      (*)委托的“-”则是从组合委托中把委托移除;

       (*)委托如果有返回值,则有一些特殊。

      委托的组合一般是给事件用的,用普通的委托的时候很少用

    事件

      案例:定一个Person类,定一个监听年龄变化的事件,当本命年的时候祝贺一下。

      触发事件的地方要判断一下是不是事件null

      事件语法:event Mydelegate mdl;

      加了event关键字实现事件机制的好处:

        用了event事件,不可以修改事件已经注册的值;不可以冒充进行事件通知了。只能+=、-=!

    委托与事件总结

      委托的作用:

        占位,在不知道将来要执行的方法的具体代码时,可以先用一个委托变量来代替方法调用(委托的返回值,参数列表要确定)。在实际调用之前,需要为委托赋值,否则为null。

      事件的作用:

         事件的作用与委托变量一样,只是功能上比委托变量有更多的限制。

        (比如:1.只能通过+=或-=来绑定方法(事件处理程序)2.只能在类内部调用(触发)事件。)

      (面试题)事件和委托的关系:事件由一个私有的委托变量和add_***和remove_***方法组成;

         事件的非简化写法:声明一个私有的委托变量和add、remove方法。

    委托和事件的区别和关系

      错误的说法“事件是一种特殊的委托”

       委托用的比较多,事件只有开发WinForm、WPF的时候用的才比较多,而WinForm、WPF则不是学习重点。掌握“事件和语法”、“委托和事件的关系和区别(面试题)”即可。

      事件监听的代码的快速生成;WinForm中的事件简单分析(谁调用的Onclick方法)

       事件、索引器、属性本质上都是方法。(面试题)接口中可以定义什么?接口中只可以定义方法。接口中也可以定义“事件、索引器、属性”,因为他们本质上也都是方法。

  • 相关阅读:
    ArrayList源代码深入剖析
    java线程基础巩固---wait和sleep的本质区别是什么,深入分析(面试常见问题)
    设计模式相关面试问题-模板方法
    设计模式相关面试问题-适配器
    设计模式相关面试问题-单例
    python-面向对象-10-单例
    python-面向对象-11-异常
    ping
    arp欺骗
    list的方法、操作
  • 原文地址:https://www.cnblogs.com/wjs5943283/p/9401046.html
Copyright © 2011-2022 走看看