什么是委托?
- 定义:委托是一种引用类型,用于封装具有特定参数列表和返回类型的方法。
- 作用:允许方法作为参数传递,并支持事件驱动编程。委托可以封装静态方法和实例方法。
定义和使用委托
定义委托
- 语法:public delegate 返回类型 委托名(参数类型 参数名, ...)
public delegate int Calculate(int x, int y);
使用委托
// 方法匹配委托签名
public static int Add(int a, int b)
{return a + b;
}public static void Main()
{// 创建委托实例并绑定方法Calculate calc = Add;// 调用委托int result = calc(5, 3);Console.WriteLine($"Result: {result}"); // 输出:Result: 8
}
多播委托
一个委托实例可以引用多个方法,所有方法按顺序调用。仅最后一个方法的返回值被返回。
public delegate void Notify(string message);public class MultiDelegateExample
{public static void SuccessMessage(string msg){Console.WriteLine($"Success: {msg}");}public static void ErrorMessage(string msg){Console.WriteLine($"Error: {msg}");}public static void Main(){Notify notify = SuccessMessage;notify += ErrorMessage;// 执行所有方法notify("Operation completed.");}
}
Func 和 Action
Func
- Func<T, TResult>:用于表示具有T类型参数且返回TResult类型结果的方法。
- 底层实现为: public delegate TResult Func<in T, out TResult>(T arg);
- 相比于Action多了一个返回值
Func<int, int, int> subtract = (a, b) => a - b;
Console.WriteLine(subtract(10, 3)); // 输出:7
Action
- Action<T>:用于没有返回值的方法。
- 底层实现为: public delegate void Action<in T>(T obj);
Action<string> showMessage = msg => Console.WriteLine(msg);
showMessage("Hello, Action!"); // 输出:Hello, Action!
匿名方法和Lambda表达式
匿名方法
- 提供了一种定义内联方法的方式,不需要命名。
Calculate multiply = delegate(int x, int y)
{return x * y;
};
Console.WriteLine(multiply(4, 5)); // 输出:20
Lambda表达式
- 是创建匿名方法的简洁形式,常用于LINQ和事件处理。
Calculate divide = (x, y) => x / y;
Console.WriteLine(divide(20, 5)); // 输出:4
使用场景
事件处理
- 在GUI应用程序中,委托常用于定义事件响应函数。
回调机制
- 用于异步编程中,指定任务完成后的操作。
策略模式
- 通过将行为以委托形式传递,实现不同算法之间的切换。
实践习题
1. 基本委托
定义一个委托类型Calculate,用于封装加减乘除方法。在主程序中,通过委托调用这些方法。
using System;public delegate int Calculate(int x, int y);public class CalculatorExample
{public static int Add(int a, int b) => a + b;public static int Subtract(int a, int b) => a - b;public static int Multiply(int a, int b) => a * b;public static int Divide(int a, int b) => a / b;public static void Main(){Calculate calc;calc = Add;Console.WriteLine($"Add: {calc(10, 5)}");calc = Subtract;Console.WriteLine($"Subtract: {calc(10, 5)}");calc = Multiply;Console.WriteLine($"Multiply: {calc(10, 5)}");calc = Divide;Console.WriteLine($"Divide: {calc(10, 5)}");}
}
2. 事件模拟
模拟一个简单的事件系统,定义一个事件委托EventHandler,创建一个触发事件的方法,并在主程序中注册事件处理器。
using System;public delegate void EventHandler(string message);public class EventSimulator
{public static event EventHandler OnEventOccurred;public static void TriggerEvent(string message){if (OnEventOccurred != null)OnEventOccurred(message);}
}public class Program
{public static void Main(){// 注册事件处理器EventSimulator.OnEventOccurred += HandleEvent;// 触发事件EventSimulator.TriggerEvent("An event has occurred.");}static void HandleEvent(string message){Console.WriteLine($"Handling event: {message}");}
}
以上示例展示了如何定义和使用委托以及事件处理机制。如果有任何问题或者想要更深入了解某个方面,请随时告诉我!