Csharp委托详解

参考视频 c#教程
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);


    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(new Program().FunD)(3 > 4 ?true:false);//3 > 4 ?true:false为三元运算符

        //13.可以绑定泛型方法
        new MyDelegateHandler(new Program().FunDD)(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)
    {
        Console.WriteLine("执行泛型方法");
    }
}

}

你可能感兴趣的:(C#教程)