集合扩展方法、委托的运算、事件

​一、集合扩展方法
用于集合操作的扩展方法有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






posted @   zhixin9001  阅读(264)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示