1.委托的定义
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。
namespace DeldgateTest { public class Program { /* * 1.声明一个委托 * 此声明决定了可由该委托引用的方法。 * eg:此委托可被用于引用任何一个带有单一int类型参数,返回int类型变量的方法 */ public delegate int MyDeletage(int s); public static int number = 10; public static void Main(string[] args) { /* * 3.创建委托对象 * 委托对象必须使用new关键字来创建,且与一个特定方法有关; * 当创建委托对象时,传递到new语句的参数就像方法调用一样书写,但不带参数 */ MyDeletage md1 = new MyDeletage(AddNumber); MyDeletage md2 = new MyDeletage(SubNumber); /* 4.使用委托对象调用方法 */ md1(10); Console.WriteLine("number is " + GetNumber()); //15 md2(5); Console.WriteLine("number is " + GetNumber()); //20 } /* * 2.定义一个入参及出参都与委托MyDeletage一致的函数 */ public static int AddNumber(int a) { number = number + a; return number; } public static int SubNumber(int b) { number = number - b; return number; } public static int GetNumber() { return number; } } }
2.委托的多播
委托对象可使用 "+" 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。
使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。
namespace DeldgateTest { public class Program { public delegate int MyDeletage(int s); public static int number = 10; public static void Main(string[] args) { //定义一个委托对象 MyDeletage md; MyDeletage md1 = new MyDeletage(AddNumber); MyDeletage md2 = new MyDeletage(SubNumber); //加入第一个委托对象 md = md1; //加入第二个委托对象 md += md2; //调用多播 md(10); Console.WriteLine("number is " + GetNumber()); //10 Console.ReadKey(); } public static int AddNumber(int a) { number = number + a; return number; } public static int SubNumber(int b) { number = number - b; return number; } public static int GetNumber() { return number; } } }