C# 初学者避坑:委托、事件与线程的正确打开方式
·
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);
}
总结要点
- 委托:将方法作为参数传递,实现灵活调用。
- 事件:基于委托的封装,确保触发权限可控。
- 线程:注意执行顺序和资源共享的同步问题。
核心逻辑均基于基础概念(方法引用、访问控制、异步执行),理解执行时机和生命周期是关键。
更多推荐

所有评论(0)