什么是委托?
- 定义:委托是一种引用类型,用于封装具有特定参数列表和返回类型的方法。
- 作用:允许方法作为参数传递,并支持事件驱动编程。委托可以封装静态方法和实例方法。
定义和使用委托
定义委托
- 语法: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}");
}
}
以上示例展示了如何定义和使用委托以及事件处理机制。如果有任何问题或者想要更深入了解某个方面,请随时告诉我!