委托(Delegate)在C#中是一种非常强大的功能。简而言之,委托允许你将方法作为参数传递给其他方法。这类似于函数指针,但比函数指针更安全和更面向对象。
基础概念:
委托的声明
你可以将委托看作是一种封装具有特定参数列表和返回类型的方法的类型。委托的声明如下:
public delegate ReturnType DelegateName(Parameters);
例如,定义一个没有返回值和参数的委托:
public delegate void SimpleDelegate();
或者定义一个返回int
并接受两个int
参数的委托:
public delegate int CalculateDelegate(int a, int b);
创建和使用委托
一旦你定义了委托,就可以声明其实例并将其与任何匹配该委托签名的方法相关联。例如:
public class MathOperations
{
public static int Add(int a, int b)
{
return a + b;
}
public static int Subtract(int a, int b)
{
return a - b;
}
}
// 创建和使用委托
CalculateDelegate addDel = MathOperations.Add;
CalculateDelegate subDel = MathOperations.Subtract;
int result1 = addDel(5, 3); // Returns 8
int result2 = subDel(5, 3); // Returns 2
事件
委托常常与事件(Event)一起使用。事件是发布/订阅模型的一部分,允许一个对象(发布者)通知其他多个对象(订阅者)关于其上发生的事件。
例如,你有一个Clock
类,它会每秒都通知其他类。这时,你可以定义一个委托和一个事件:
public class Clock
{
public delegate void SecondPassedDelegate();
public event SecondPassedDelegate OnSecondPassed;
public void StartClock()
{
while (true)
{
System.Threading.Thread.Sleep(1000);
OnSecondPassed?.Invoke(); // Invoke the event
}
}
}
然后其他类可以订阅这个事件:
public class Timer
{
public void StartListening(Clock clock)
{
clock.OnSecondPassed += Notify;
}
void Notify()
{
Console.WriteLine("A second has passed!");
}
}
委托的其他特点
多播委托
一个委托可以引用多个方法。这意味着当你调用这个委托时,所有关联的方法都会被调用。
SimpleDelegate del1 = () => Console.WriteLine("Method 1");
SimpleDelegate del2 = () => Console.WriteLine("Method 2");
SimpleDelegate combinedDel = del1 + del2;
combinedDel();
// Output:
// Method 1
// Method 2
使用Lambda表达式和委托
你可以使用Lambda表达式来简化委托的使用:
CalculateDelegate multiplyDel = (x, y) => x * y;
使用预定义的委托
C#提供了一些预定义的泛型委托类型,如Func
和Action
,所以你通常不需要自己定义委托。
Action
用于没有返回值的方法。Func
用于有返回值的方法。- Action<int, int> printSumDel = (x, y) => Console.WriteLine(x + y);
Func<int, int, int> multiplyDel = (x, y) => x * y;
委托在C#中是非常重要的概念,特别是当涉及到事件和Lambda表达式时。希望这个简单的介绍能帮助你更好地理解和使用委托。