在C#中,事件是一种特殊的委托类型,用于通知其他类有某件事发生。事件允许一个类公开某些特定的行为,而订阅者可以在这些行为发生时收到通知。委托则是类型安全的函数指针,可以指向具有匹配签名的方法。
C# 中的事件声明与订阅
-
事件声明: 在类中声明一个事件,通常使用
event
关键字和一个委托类型:public delegate void ItemChangedEventHandler(object sender, EventArgs e); // 定义一个委托类型public class Inventory {public event ItemChangedEventHandler ItemAdded; // 声明一个事件public void AddItem(Item item){// ... 实现添加物品逻辑...OnItemAdded(this, EventArgs.Empty); // 触发事件}protected virtual void OnItemAdded(object sender, EventArgs e){ItemAdded?.Invoke(sender, e); // 安全地调用所有订阅者} }
-
事件订阅: 其他类可以通过+=操作符订阅事件:
public class Player {private Inventory inventory;public Player(Inventory inv){inventory = inv;inventory.ItemAdded += OnInventoryItemAdded; // 订阅事件}private void OnInventoryItemAdded(object sender, EventArgs e){Debug.Log("Player received notification that an item was added to the inventory.");} }
委托定义与实例化
-
委托定义: 一个委托类型定义了一种方法签名,任何与该签名匹配的方法都可以赋值给该委托类型的实例。
public delegate int Operation(int x, int y); // 定义一个简单的加减乘除运算委托
-
委托实例化: 可以通过实例化一个委托并将一个符合签名的方法作为参数传入来创建委托实例。
class MathOperations {public static int Add(int a, int b) => a + b;public static int Subtract(int a, int b) => a - b;public Operation AddOperation => new Operation(MathOperations.Add);public Operation SubtractOperation => new Operation(MathOperations.Subtract); }
Action 和 Func 委托
-
Action 委托:
Action
是一种无返回值的委托,可以接收0到16个参数。例如,Action<int, string>
表示一个不返回值,接受一个整数和一个字符串参数的方法。Action<string> printMessage = Console.WriteLine; // 实例化一个Action委托printMessage("Hello, World!"); // 调用委托
-
Func 委托:
Func
是一种带返回值的委托,同样可以接收0到16个参数,最后一个类型参数是返回值类型。例如,Func<int, string, bool>
表示一个接受一个整数和一个字符串参数,返回一个布尔值的方法。Func<int, int, int> addNumbers = (x, y) => x + y; // 实例化一个Func委托int result = addNumbers(3, 5); // 调用委托,返回结果8
总结
通过事件和委托,C#提供了强大的回调机制,使得程序更加灵活,易于模块化。事件主要用于跨类间的通信,而委托则更广泛地应用于需要传递和执行方法的场合,Action和Func委托作为预定义的泛型委托类型,极大地方便了日常开发中的使用。