码迷,mamicode.com
首页 > Windows程序 > 详细

C#委托一——委托初解

时间:2015-04-03 11:28:14      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:c#委托   委托   

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






C#委托一——委托初解

标签:c#委托   委托   

原文地址:http://blog.csdn.net/panpen120/article/details/44850997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!