Csharp委托详解

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Csharp委托和事件详解
{
    /*
     * 作者:Ai
     * 时间:2018.3.1
     * 
     * ps:委托和事件我已经学习了好几遍了,但隔得时间长了总是又忘记,
     * 今晚突然想写点什么,看了一眼目录,发现委托和事件已经忘得差不多了,
     * 所以就写了下文,希望在以后自己能尽快的回想起来自己曾经的学习过程。
     * 
     */
    class Program
    {


        /*
         * 0.什么是委托?
         * 委托是对一类方法的封装
         */

        //1.声明一个委托类型(注意:委托的层次级别相当于 枚举或结构体 不能在方法中声明委托类型
        public delegate void MyDelegateHandler();//这是一个代表无参数无返回值的方法的委托

        //6.声明一个带参数的委托类型(返回值和参数都为string 
        public delegate string MyDelegateHandler_String(string str);

        //11.声明一个object参数的委托类型用于委托逆变
        public delegate void MyDelegateHandler_Object(object c);

        //12.声明一个泛型委托类型(表示一系列泛型类型和参数类型一致的方法
        public delegate void MyDelegateHandler<T>(T t);


        static void Main(string[] args)
        {
            //3.声明一个委托类型实例,在构造中为他传递一个匹配的方法
            //注:这样就做到了将方法像方法参数一样传递给委托对象
            MyDelegateHandler myDelegateHandler = new MyDelegateHandler(new Program().FunA);//相当于用myDelegateHandler 来指代FunA

            //4.调用委托(像方法一样调用
            myDelegateHandler();

            //5.同理我们可以传递其他匹配的方法
            myDelegateHandler = new MyDelegateHandler(new Program().FunAA);

            myDelegateHandler();

            //7.带参数的委托
            string str = new MyDelegateHandler_String(new Program().FunB)("Hello,Delegate");
            Console.WriteLine(str);


            //8.多播委托(一个委托对象可以绑定多个匹配方法
            myDelegateHandler = null;//将myDelegateHandler清空
            myDelegateHandler = new Program().FunAA;//可以使用=绑定方法
            myDelegateHandler += new Program().FunA;//第一个以后的方法使用+=绑定
            myDelegateHandler();//执行委托(会按照绑定顺序依次执行
            myDelegateHandler -= new Program().FunAA;//解除绑定


            //9.委托逆变
            //在有些时候我们不知道参数的具体类型,则通过object类型的参数,内部is判断来动态装箱拆箱
            new MyDelegateHandler_Object(new Program().FunC)(100);
            new MyDelegateHandler_Object(new Program().FunC)("Hello,MyDelegateHandler_Object委托");
            new MyDelegateHandler_Object(new Program().FunC)(new Program());

            //12.泛型委托
            //尽管普通委托已经可以代表一个类型的方法,但某些时候我们需要一种委托就能代表一系列的方法
            new MyDelegateHandler<Boolean>(new Program().FunD)(3 > 4 ?true:false);//3 > 4 ?true:false为三元运算符

            //13.可以绑定泛型方法
            new MyDelegateHandler<int>(new Program().FunDD<int>)(10);

            //14.委托可以嵌套(委托绑定委托
            new MyDelegateHandler(new MyDelegateHandler(new Program().FunA))();


            //15.委托也可以被继承
        }

        //2.定义一个可以被委托代理的同类方法(在这里就是无参数,无返回值
        void FunA()
        {
            Console.WriteLine("执行方法A");
        }

        void FunAA()
        {
            Console.WriteLine("执行方法AA");
        }


        string FunB(string str)
        {
            return str;
        }

        //10.逆变方法
        void FunC(object c)
        {
            //通过is判断类型
            if (c is int)
            {
                Console.WriteLine("输入的int值为 "+c);
            }
            else if (c is string)
            {
                Console.WriteLine("输入的string值为 "+c);
            }
            //不符合
            else
            {
                Console.WriteLine("输入类型无法识别");
            }
        }

        void FunD(bool a)
        {
            Console.WriteLine("执行方法D,值="+a);
        }
        void FunDD<T>(T t)
        {
            Console.WriteLine("执行泛型方法");
        }
    }
}

发布了25 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37446649/article/details/80445640
今日推荐