zoukankan      html  css  js  c++  java
  • 集合扩展方法、委托的运算、事件

    ​一、集合扩展方法
    用于集合操作的扩展方法有Where、Select、Max、Min、Sum、OrderBy、ToList、First、FirstOrDefault、Single、SingleOrDefault等。原来还有Max、Min、Sum这些扩展方法,而且ToList也是扩展的。上一篇有写过MyWhere方法,MySum可这样写:
    public static int MySum<T>(this IEnumerable<T> data, Func<T, int> func) {
      int sum = 0;
      foreach (T item in data) {
        sum += func(item);
      }
      return sum;
    }

    First与FirstOrDefault的区别在于,集合为空或null时,前者会报错,后者则返回空。而如果集合中元素大于一个时,Single和SingleOrDefault会报InvalidOperationException:"Sequence contains more than one element"错误。

    二、委托的运算
    委托也可以进行加减运算,如有两个符合Action<int>签名的方法F1和F2:
    static void F1(int i) {
      Console.WriteLine("this's f1:" + i);
    }
    static void F2(int i) {
      Console.WriteLine("this's f2:" + i);
    }
    用委托a1和a2分别指向F1、F2,然后a3为前两个委托的和:
    Action<int> a1 = F1;
    Action<int> a2 = F2;
    Action<int> a3 = a1 + a2;
    执行a3(1)时,会依次运行F1和F2方法,同时它们接受的参数都为1。
    执行a3 =a3 - a1后,再次运行a3,则只会执行F2,因为a1被减掉了。如果委托有返回值,相加后的委托执行后的返回值为最后一个方法的返回值。

    三、事件
    Person类中有事件On12Y,Person的Age每增加12岁,会触发该事件
    class Person {
      private int age;
      public int Age {
        get => age;
        set {
          if (value % 12 == 0) {
            //if (On12Y != null) {
            //  On12Y();
            //}
            On12Y?.Invoke();
          }
        }
      }
      public event Action On12Y;
    }
    //调用,事件触发时调用P1_On12Y
    var p1 = new Person();
    p1.On12Y += P1_On12Y;
    //p1.On12Y = null;
    for (var i = 1; i <= 49; i++) {
      p1.Age = i;
    }
    这是事件的基本使用。
    关于事件与委托的关系,可以尝试将上面代码中的public event Action On12Y;修改为public Action On12Y;去掉event修饰符,On12Y就变成了普通的委托,然后在使用时除了可以注册、注销事件外,还可以进行p1.On12Y = null之类的操作。可见事件与委托的区别在于事件在委托的基础上做了限制,只能注册、注销自己。
    但事件并不是“特殊的委托”这么简单,事件的完整写法为:
    public Action _on12Y;
    public event Action On12Y {
      add {
        this._on12Y += value;
      }
      remove {
        this._on12Y -= value;
      }
    }
    与属性类似,可见事件是对委托的封装。
    关于Winform中的事件句柄EventHandler,也是一种委托:public delegate void EventHandler(object sender, EventArgs e);
    其签名为事件触发者和事件参数。


    学习资料:如鹏网.net提高班http://www.rupeng.com/News/10/4603.shtml






  • 相关阅读:
    ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
    Linux学习安装
    linux中的虚拟环境工具
    linux 文件目录权限
    PHP利用百度ai实现文本和图片审核
    Laravel + Swoole 打造IM简易聊天室
    Mysql索引降维 优化查询 提高效率
    Nginx支持比Apache高并发的原因
    网站高并发解决方案(理论知识)
    mysql大量数据分页查询优化-延迟关联
  • 原文地址:https://www.cnblogs.com/zhixin9001/p/7689280.html
Copyright © 2011-2022 走看看