C#中的delegate委托类型基本学习教程

2019-12-30 11:35:55王冬梅


public delegate void Del(string message);

委托对象通常通过提供委托将封装的方法的名称或使用匿名方法构造。对委托进行实例化后,委托会将对其进行的方法调用传递到该方法。调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方。这被称为调用委托。实例化的委托可以按封装的方法本身进行调用。例如:


 // Create a method for a delegate.
public static void DelegateMethod(string message)
{
  System.Console.WriteLine(message);
}


 // Instantiate the delegate.
Del handler = DelegateMethod;

// Call the delegate.
handler("Hello World");

 

委托类型派生自 .NET Framework 中的 Delegate 类。委托类型是封装的,它们不能派生出其他类,也不能从 Delegate 派生出自定义类。由于实例化的委托是一个对象,因此可以作为参数传递或分配给一个属性。这允许方法作为参数接受委托并在稍后调用委托。这被称为异步回调,是在长进程完成时通知调用方的常用方法。当以这种方式使用委托时,使用委托的代码不需要知道要使用的实现方法。功能类似于封装接口提供的功能。
回调的另一个常见用途是定义自定义比较方法并将该委托传递到短方法。它允许调用方的代码成为排序算法的一部分。以下示例方法使用 Del 类型作为参数:


public void MethodWithCallback(int param1, int param2, Del callback)
{
  callback("The number is: " + (param1 + param2).ToString());
}

然后,你可以将上面创建的委托传递到该方法:


MethodWithCallback(1, 2, handler);

并将以下输出接收到控制台:


The number is: 3

以抽象方式使用委托时,MethodWithCallback 不需要直接调用控制台,记住,其不必设计为具有控制台。 MethodWithCallback 的作用是简单准备字符串并将字符串传递到其他方法。由于委托的方法可以使用任意数量的参数,此功能特别强大。
当委托构造为封装实例方法时,委托将同时引用实例和方法。委托不知道除其所封装方法以外的实例类型,因此委托可以引用任何类型的对象,只要该对象上有与委托签名匹配的方法。当委托构造为封装静态方法时,委托仅引用方法。请考虑以下声明:


public class MethodClass
{
  public void Method1(string message) { }
  public void Method2(string message) { }
}