C# 委托(Delegate)是一种将方法作为参数传递的类型,可以用于实现回调函数、事件处理程序等。委托类型定义了方法的签名,可以将符合该签名的任何方法赋值给该委托变量。在 C# 中,委托是一种类,可以实例化并用于调用方法。
以下是一个简单的委托的示例:
using System;
delegate void GreetingDelegate(string name);
class Program
{
static void MAIn()
{
GreetingDelegate greeting = SayHello;
greeting("John");
}
static void SayHello(string name)
{
Console.WriteLine("Hello, " + name + "!");
}
}
在上面的示例中,我们定义了一个名为 'G的委托类型,该委托类型接受一个字符串参数并返回 'voidvoid。接下来,在Main方法中,我们创建了一个委托类型的变量greeting,并将其赋值为 'SaySayHello方法。最后,我们调用 'ggreeting变量,将字符串参数传递给它,它会调用 'SaySayHello方法并输出字符串。
在实际应用中,委托通常与事件一起使用,用于处理事件。要编写一个包含委托的程序,您需要考虑以下步骤:
需要注意的是,委托变量在调用时可以同时调用多个方法,这被称为多路广播(Multicast)。可以使用 '+运算符将多个方法添加到委托变量中,使用-=运算符将方法从委托变量中移除。
以下是一个使用委托处理事件的示例:
using System;
class Program
{
static void Main()
{
var publisher = new Publisher();
var subscriber = new Subscriber();
publisher.SomethingHAppened += subscriber.HandleSomethingHappened;
publisher.DoSomething(); // 触发事件
}
}
class Publisher
{
public event EventHandler SomethingHappened;
public void DoSomething()
{
Console.WriteLine("Something happened!");
if (SomethingHappened != null)
{
SomethingHappened(this, EventArgs.Empty);
}
}
}
class Subscriber
{
public void HandleSomethingHappened(object sender, EventArgs e)
{
Console.WriteLine("Something happened and I was notified!");
}
}
在上面的示例中,Publisher类声明了一个名为SomethingHappened的事件,Subscriber类中定义了一个名为HandleSomethingHappened的方法,该方法符合EventHandler委托类型的签名。在Main方法中,我们创建了一个Publisher对象和一个Subscriber对象,然后将Subscriber的HandleSomethingHappened方法添加到Publisher的SomethingHappened事件中。当Publisher触发SomethingHappened事件时,Subscriber中的HandleSomethingHappened方法将被调用。
总之,委托是 C# 中一种非常有用的机制,可以方便地实现回调函数、事件处理程序等。委托的使用可以使代码更加灵活和可扩展。