在C#中,委托(Delegate)是一种特殊的类型,它定义了方法的签名,并允许将方法作为参数传递给其他方法,或者将方法绑定到事件处理器上。委托实际上是对具有相同签名(返回类型和参数类型)的方法的引用。
基本用法
-
定义委托:
首先,需要定义一个委托类型,它指定了委托可以引用的方法的返回类型和参数列表。public delegate int MyDelegate(int x, int y);
在这个例子中,
MyDelegate
是一个委托类型,它可以引用任何返回类型为int
且接受两个int
参数的方法。 -
实现方法:
接下来,需要实现一些符合委托签名的方法。public class MyClass {public int Add(int x, int y){return x + y;}public int Subtract(int x, int y){return x - y;} }
-
创建委托实例并关联方法:
然后,可以创建委托实例并将它们关联到具体的方法。MyClass obj = new MyClass(); MyDelegate addDelegate = new MyDelegate(obj.Add); MyDelegate subtractDelegate = new MyDelegate(obj.Subtract);
-
调用委托:
可以像调用普通方法一样调用委托。int resultAdd = addDelegate(5, 3); // 输出 8 int resultSubtract = subtractDelegate(5, 3); // 输出 2
-
委托链:
还可以将多个委托链接在一起,形成一个调用列表。当调用这样的委托时,会依次调用链中的所有方法。MyDelegate bothDelegates = addDelegate + subtractDelegate; int resultBoth = bothDelegates(5, 3); // 先调用 Add 后调用 Subtract,结果可能不是预期的单个值,而是最后一个调用的返回值
注意:在C#中,委托链的调用顺序是从左到右,但最终的返回值是链中最后一个委托调用的返回值。如果需要组合多个方法的返回值,通常需要手动处理。
-
匿名方法和Lambda表达式:
在C# 2.0及更高版本中,还可以使用匿名方法和Lambda表达式来简化委托的创建。MyDelegate anonymousDelegate = delegate(int x, int y) { return x * y; }; MyDelegate lambdaDelegate = (x, y) => x * y;int resultAnonymous = anonymousDelegate(5, 3); // 输出 15 int resultLambda = lambdaDelegate(5, 3); // 输出 15
委托与事件
委托在C#中常用于事件处理。事件是一种特殊的委托,它提供了一种发布/订阅模型,使得一个对象(发布者)能够在发生特定事件时通知其他对象(订阅者)。
public delegate void MyEventHandler(object sender, EventArgs e);public class Publisher
{public event MyEventHandler MyEvent;protected virtual void OnMyEvent(){MyEvent?.Invoke(this, EventArgs.Empty);}public void TriggerEvent(){OnMyEvent();}
}public class Subscriber
{public void HandleEvent(object sender, EventArgs e){Console.WriteLine("Event handled!");}
}class Program
{static void Main(string[] args){Publisher publisher = new Publisher();Subscriber subscriber = new Subscriber();publisher.MyEvent += subscriber.HandleEvent;publisher.TriggerEvent(); // 输出 "Event handled!"}
}
在这个例子中,Publisher
类定义了一个事件MyEvent
,当调用TriggerEvent
方法时,会触发该事件,通知所有订阅者(在这个例子中是Subscriber
的HandleEvent
方法)。
总结
委托是C#中一种强大的功能,允许将方法作为参数传递,并且可以用于事件处理。