PanPen120在CSDN上原创,如其他网站转载请注意排版和写明出处:
今天一直在研究委托,因为有函数指针的基础,还容易上手,但是对于一些概念和实践,总是为了弄的非常清楚而纠结,这几篇关于委托的文章我是结合《C#与.NET4高级程序设计》、MSDN、借鉴其他人的博文来总结话语,以最直接简洁的话来阐述清楚(在我弄懂之前网上的感觉都很模糊)
namespace DelegateDemo { //function1: public delegate int setMyName(string name); //委托类型 //function2: class MyClass { public delegate int setMyName2(string name); public setMyName mermber; //委托类型成员 } //function3 class MyClass2 { public delegate int setMyName3(string name); private setMyName3 mermber2; //注册函数 public MyClass2(setMyName3 fun,string name) { mermber2 = fun; if (null != mermber2) { mermber2(name); } } } class Program { //要调用的方法 public static int GetMyName(string name) { Console.WriteLine("My Name Is {0}",name); return 1; } static void Main(string[] args) { //function1: setMyName setName = new setMyName(GetMyName); setName("Function1:婴儿"); //function2: MyClass setName2 = new MyClass(); setName2.mermber = GetMyName; setName2.mermber("Function2:青少年"); //function3: MyClass2 setName3 = new MyClass2(GetMyName, "Function3:中年"); //function3(other): MyClass2 setName4 = new MyClass2(new MyClass2.setMyName3(GetMyName), "Function4:老年"); //支持多路广播(维护一个可调用方法列表,顺序调用列表中的委托) //+=合并(简写) -=注销 setMyName multicast = null; multicast += (setName2.mermber); //演示合并需要两个……为了不破坏function3的封装性建setName5 setMyName setName5 = GetMyName; multicast += setName5; //合并的是两个委托类型对象的成员 multicast("合并的是两个委托类型对象的成员:迟暮"); multicast += GetMyName; multicast += GetMyName; multicast("合并的是两个调用的方法:耄耋"); //合并的是两个调用的方法(更能表现出委托类型或者是成员都是一个地址) Console.ReadLine(); } } }
//方法一:定义委托类型
// new委托对象(传入要调用的方法名)
// 对象();
//方法二:定义委托类型
// 定义该委托类型的成员变量(public)
// 该成员变量 = 调用的方法
// 成员变量();
//方法三:定义委托类型
// 定义该委托类型的成员变量(private)
// 写一个注册函数(参数:委托类型)
// 调用该注册函数(传入要调用的方法)-----------两种传入方式:<1>要调用方法的名字 ||
// <2>new委托类型所在的类点出委托类型(要调用的方法) ||运行结果相同
// 例如: new Car.CarEngineHandler(OnCarEngineEvent) ||
// 调用该类另一个辅助函数:功能 1:判断委托的成员变量是否为null
// 2. 使用委托的成员变量();
//备注1:所谓的注册函数就是一个普通函数,目的是为了封装委托
//备注2:在方法一中第二步骤的参数------------------------------------两种方式:||<1>要调用的方法是static可直接传入该方法的名字
// ||<2>不是static则传入该方法所在类的实体对象.该方法名
//备注3:按照方法三将委托定义在使用它的类中是一种很普遍的做法
//备注4:方法三中第一种传入方式叫做---方法组转换语法(不需要委托对象直接传入方法名)------ -----C#2.0后的新语法