Lambda 表达式解析

Lambda 表达式 s => s.Score > 80 中:

  • => 是 Lambda 运算符,左侧为输入参数,右侧为表达式或语句块。
  • 参数 s 的类型由编译器根据上下文推断(如 students 集合中的元素类型)。
    等效写法包括显式指定参数类型或使用匿名方法:
students.FindAll(s => s.Score > 80);
students.FindAll((Student s) => s.Score > 80);
students.FindAll(delegate(Student s) { return s.Score > 80; });


委托的本质与用法

委托是方法签名的类型模板,而非方法本身:

public delegate int MathOperation(int a, int b);  // 定义委托类型
MathOperation op = Calculator.Add;  // 将方法赋值给委托变量
Console.WriteLine(op(10, 5));      // 通过委托调用方法

常见错误:在委托声明中编写实现逻辑(委托仅定义签名,不包含实现)。


事件的安全封装

事件通过限制委托的访问权限实现安全控制:

  • 外部代码只能通过 += 订阅或 -= 取消订阅。
  • 触发事件的权限仅限事件发布者。
public event EventHandler TimeUp;  // 事件声明
TimeUp?.Invoke(this, EventArgs.Empty);  // 仅在类内部触发

顺序陷阱:必须先订阅事件再触发,否则订阅者无法接收通知。


多线程同步问题

线程启动(Start())是异步的,主线程需等待子线程完成:

Thread threadA = new Thread(() => { /* 计算逻辑 */ });
threadA.Start();
threadA.Join();  // 阻塞主线程直至 threadA 结束

文件写入同步:多线程写入同一文件需加锁:

private static readonly object lockObj = new object();
lock (lockObj) {
    File.AppendAllText("output.txt", content);
}


总结要点

  • 委托:将方法作为参数传递,实现灵活调用。
  • 事件:基于委托的封装,确保触发权限可控。
  • 线程:注意执行顺序和资源共享的同步问题。
    核心逻辑均基于基础概念(方法引用、访问控制、异步执行),理解执行时机和生命周期是关键。

更多推荐