委托(delegate)
委托声明定义了一种类型,它用一组特定的参数以及返回类型来封闭方法。对于静态方法,委托对象
封装要调用的方法。对于实例方法,委托对象同时封闭一个实例和该实例上的一个方法。如果您有一
个委托对象和一组适当的参数,则可以用这些参数调用该委托。
委托提供了类似于c++中函数指针的功能,简单的说委托类型就是面向对象函数指针。
不过c++的函数指针只能指向静态的方法,而委托除了可以指向一个静态的函数方法外,还可以指
向对象的实例的方法。而最大的差异在于委托是完全的面向对象,且使用安全的类型,另外委托允许程序员在程序执行时传入
方法的名称,动态的决定预调用的方法。如此的弹性更能让程序员随心所欲的发挥。
委托的本质是一个类,任何可以声明类的地方都可以使用委托。
委托的使用举例:
using System; delegate void EatDelegate(string food);//委托的声明,返回值及形参要与所指向的函数对应 class MyDelegate { static void zsEat(string food) { Console.WriteLine("zs eat "+food); } static void lsEat(string food) { Console.WriteLine("ls eat "+food); } static void wwEat(string food) { Console.WriteLine("ww eat "+food); } static void Main() { EatDelegate zs=new EatDelegate(zsEat); EatDelegate ls=new EatDelegate(lsEat); EatDelegate ww=new EatDelegate(wwEat); //方法一 zs("apple"); Console.WriteLine("--------------"); //方法二 EatDelegate eatChain; eatChain=zs+ls+ww; eatChain("orange"); Console.WriteLine("--------------"); //方法三 eatChain-=zs;//??zs??? eatChain("banana"); Console.WriteLine("--------------"); //方法四 eatChain+=zs;//???zs??? eatChain("banana"); Console.WriteLine("--------------"); //方法五,匿名方法 /* * EatDelegate eatChain=null; * eatChain+=delegate(string food){console.writeLine("zs eat "+food);}; * eatChain("pear"); */ } }