C# 委托(Delegate)


C# 委托(Delegate)

C# 中的委托(Delegate)是一种类型,它可以用于封装方法的引用。委托可以看作是一个指向方法的指针,可以在运行时动态地绑定方法。通过使用委托,可以将方法作为参数传递给其他方法或将方法作为返回值返回。它提供了一种机制,可以在程序中处理回调和事件。

定义委托

定义委托需要使用 delegate 关键字。它的一般形式是:

delegate returnType delegateName (parameterType1 parameterName1, ..., parameterTypeN parameterNameN);

其中 delegateName 是委托的名称,returnType 是委托所要封装方法的返回类型,parameterType1parameterTypeN 是方法的参数类型,parameterName1parameterNameN 是方法的参数名称。

例如,下面的代码定义了一个委托 MyDelegate,它封装了一个带有两个 int 类型参数并返回一个 int 类型值的方法:

delegate int MyDelegate (int x, int y);

创建委托实例

在 C# 中,可以通过将方法名传递给委托的构造函数来创建委托的实例。例如,假设有一个方法 Add

static int Add (int x, int y) {
    return x + y;
}

可以使用以下方式来创建一个封装了 Add 方法的委托实例:

MyDelegate del = new MyDelegate(Add);

现在,del 可以像方法一样调用:

int result = del(3, 4);
Console.WriteLine(result); // 输出 7

使用委托

使用委托可以将方法作为参数传递给其他方法,这可以实现回调机制。下面的示例演示了如何使用委托来实现一个基本的回调机制:

delegate void MyCallback(int value);

static void Main(string[] args) {
    DoSomeWork(PrintValue);
}

static void DoSomeWork(MyCallback callback) {
    for (int i = 0; i < 5; i++) {
        callback(i);
    }
}

static void PrintValue(int value) {
    Console.WriteLine(value);
}

在上面的代码中,DoSomeWork 方法接受一个委托类型的参数 callback,并使用它来进行回调,将每个数值都传递给 PrintValue 方法来打印。在 Main 方法中调用 DoSomeWork 方法,并将 PrintValue 方法作为参数传递。

还可以使用委托来实现事件机制。事件是特殊的委托类型,它用于将一个或多个方法的引用存储在事件上,并在事件触发时自动调用它们。例如,可以使用以下方式声明一个事件:

public event EventHandler OnEvent;

EventHandler 是一个委托类型,它定义了一个可以用于处理事件的签名。该事件可以在类中任何需要的位置触发,并通过以下方式来调用事件处理程序:

OnEvent?.Invoke(this, EventArgs.Empty);

? 表示如果 OnEvent 不为 null,才会调用委托实例。EventArgs.Empty 表示不传递任何参数。

总结

C# 中的委托是一种类型,它可以用于封装方法的引用,并可用于处理回调和事件。定义委托使用 delegate 关键字,创建委托实例使用委托的构造函数来将方法名作为参数传递,使用委托可以将方法作为参数传递给其他方法或将其作为返回值返回。它提供了一种机制,可以在程序中灵活地处理回调和事件。