委托是一种可以把引用存储为函数的类型,定义了委托后,就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用,之后就可以使用委托变量调用这个函数,就像是该变量是一个函数一样,有了引用函数的变量后,还可以执行不能用其他方式完成的操作,例如可以把委托变量作为参数传递给一个函数,这样该函数就可以使用委托调用它引用的任何函数,而且在运行之前无需知道调用的是哪个函数。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpRumenJD { class Program { delegate void ProcessDelegate(int num); static void ShowDouble(int num) { num *= 2; Console.WriteLine(num); } static void ShowThree(int num) { num *= 3; Console.WriteLine(num); } static void ShowFour(int num) { num *= 4; Console.WriteLine(num); } /// <summary> /// 这里把委托作为参数传递给函数, /// </summary> /// <param name="pro"></param> /// <param name="num"></param> static void Excute(ProcessDelegate pro, int num) { pro(num); } static void Main(string[] args) { ProcessDelegate pro = null; string input = Console.ReadLine(); if (input == "D") pro += ShowDouble; //关联函数的第一种方法 else if (input == "F") pro = ShowFour; //关联函数的第二种方法 else pro = new ProcessDelegate(ShowThree);//关联函数的第三种方法 Excute(pro, 1); Console.ReadKey(); } } }
其中+=可实现累积关联连续关联的效果,就是说多次调用+=,委托关联的方法会按照顺序依次调用所有关联的方法;
C# 2.0以前,使用命名的方法是对委托进行实例化的唯一方式。但是在C#2.0以后的版本中,在创建新方法的系统开销不必要时,允许您对委托进行实例化,并立即指定委托将在被调用时处理的代码块。
这些被称为匿名方法,
参考资料: