C#沉淀之委托的深入讲解

2020-01-05 09:37:19刘景俊

什么是委托

要传递方法,就必须把方法的细节封装在一钟新类型的对象中,即委托。委托是一种特殊类型的对象,其特殊之处在于,我们以前定义的所有对象都包含数据,而委托只包含一个或多个方法的地址。

.NET版本中,委托指向方法的地址。在C++中,函数指针是一个指向内存位置的指针,但它不是类型安全的。开发者无法判断这个指针实际指向什么,像参数和返回值等项就更不知道了。

.NET委托是类型安全的类,它定义了返回类型和参数的类型。委托类不仅包含对方法的引用,也可以包含对多个方法的引用。

可以认为委托是持有一个或多个方法的对象。委托可以被执行,执行委托时委托会执行它所“持有”的方法

代码示例:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeForDelegate
{
 //使用关键字delegate声明委托类型
 //委托是一种类型,所以它与类属于同一级别
 //注意:这里是委托类型,而不是委托对象
 delegate void MyDel(int value);

 class Program
 {

  void PrintLow(int value)
  {
   Console.WriteLine("{0} - Low Value", value);
  }

  void PrintHigh(int value)
  {
   Console.WriteLine("{0} - High Value", value);
  }

  static void Main(string[] args)
  {
   //实例化Program类,以访问PrintLow和PrintHigh方法
   Program program = new Program();

   //声明一个MyDel类型的委托
   MyDel del;

   //创建随机数
   Random rand = new Random();
   int randomvalue = rand.Next(99);

   //使用三目运算符根据当前随机数的值来创建委托对象
   del = randomvalue < 50
    ? new MyDel(program.PrintLow)
    : new MyDel(program.PrintHigh);

   //执行委托
   del(randomvalue);

   Console.ReadKey();
  }
 }
}

从上例可以看出,使用委托的首先得通过关键字delegate声明一个委托类型,这个委托类型包括返回值、名称、签名;当类型声明好以后,需要通过new来创建委托对象,创建对象时的参数是一个方法,这个方法的签名和返回类型必须与该委托类型定义的签名一致;调用委托时,直接通过实例化的委托对象名,并提供参数即可,然后委托会执行在其所持有的方法