事件和委托,Lambda表达式
首先记住最基本的概念:
委托,其实就是方法的引用。
事件是基于委托的。事件允许一个对象(发布者)通知其他对象(订阅者)发生了某个动作。
委托示例
// 定义一个委托类型,它可以引用返回值为 void,且参数为两个 int 类型的方法
public delegate void MathOperation(int x, int y);
// 定义一个与委托匹配的方法
public static void Add(int x, int y)
{
Console.WriteLine($"Sum: {x + y}");
}
// 定义另一个匹配的减法方法
public static void Subtract(int x, int y)
{
Console.WriteLine($"Difference: {x - y}");
}
public static void Main(string[] args)
{
// 创建一个委托实例,指向 Add 方法
MathOperation op = Add;
op(10, 20); // 输出: Sum: 30
// 将委托指向 Subtract 方法
op = Subtract;
op(20, 10); // 输出: Difference: 10
}
事件示例:
// 定义一个委托
public delegate void NotifyEventHandler(string message);
// 定义一个发布者类,包含事件
public class Publisher
{
// 声明一个事件
public event NotifyEventHandler Notify;
public void DoSomething()
{
// 做一些事情后触发事件
Notify?.Invoke("任务完成!");
}
}
// 定义一个订阅者类
public class Subscriber
{
// 订阅事件的处理程序
public void OnNotify(string message)
{
Console.WriteLine($"收到通知:{message}");
}
}
public class Program
{
public static void Main(string[] args)
{
// 创建发布者和订阅者
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// 订阅事件
publisher.Notify += subscriber.OnNotify;
// 执行发布者操作,触发事件
publisher.DoSomething(); // 输出: 收到通知:任务完成!
}
}
Invoke
是用于调用委托的方法。当你使用 Invoke
方法时,实际上是在执行委托所引用的方法。
event
关键字用于定义事件,它封装了委托,不允许在外部直接调用,只能由定义事件的类触发。即Notify?.Invoke("任务完成!"); 是在Publisher发布者类内
发布者定义并触发事件,订阅者通过委托订阅事件。
Lambda 表达式是一种简洁的匿名方法写法,可以用来定义内联方法或传递给委托和事件处理器。
格式:(parameters) => expression
基本的 Lambda 表达式:
// 使用 Lambda 表达式来定义一个委托
Func<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(10, 20)); // 输出: 30
Func<int, int, int>
是一个内置委托类型,表示一个接受两个 int
参数并返回一个 int
值的方法。Lambda 表达式 (x, y) => x + y
是方法的具体实现。
与委托结合的 Lambda 表达式
// 定义一个委托
public delegate void PrintOperation(string message);
// 使用 Lambda 表达式
PrintOperation print = message => Console.WriteLine(message);
print("Hello, Lambda!"); // 输出: Hello, Lambda!
FUNC和ACTION型委托,它们都用于简化委托的使用
Func
委托
- 功能:用于表示一个具有返回值的方法。
Func
委托可以有最多 16 个参数和一个返回值。Func<参数1类型, 参数2类型, ..., 返回值类型> 例如: Func<int, int, int> add = (a, b) => a + b; int result = add(3, 4); // result 为 7
-
Func 示例
// 定义一个 Func 委托,接受两个整数参数并返回一个整数 Func<int, int, int> multiply = (x, y) => x * y; int product = multiply(5, 6); // product 为 30
-
Action
委托 - 功能:用于表示一个没有返回值的方法。
Action
委托可以有最多 16 个参数,但不返回值。
Action<参数1类型, 参数2类型, ...> 例如:
Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello, World!"); // 输出: Hello, World!
Action 示例
// 定义一个 Action 委托,接受一个字符串参数并不返回值
Action<string> greet = name => Console.WriteLine($"Hello, {name}!");
greet("Alice"); // 输出: Hello, Alice!