C#委托一——委托初解

来源:互联网 发布:java多线程代码 编辑:程序博客网 时间:2024/06/06 17:23

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后的新语法





0 0