学习笔记-委托

   //委托的作用就是把方法封装成一个委托类型的变量
    //这个类型承载了一个或者多个方法
//委托时候可以连加的,委托是可以被执行的。就想调用方法一样。
  delegate void DL(int i);
    class Program
    {     
        static void Main(string[] args)
        {
            Program p = new Program();
            DL dl = new DL(ff);
            DL d2 = new DL(FFF);
            //委托的匿名使用
            DL d4 = delegate(int i) { Console.WriteLine("wu"); Console.WriteLine(i); };
            // DL d5 = new DL({Console.WriteLine("wu"); Console.WriteLine(i);});//错误的使用匿名方法
            DL dl3 = dl + d2 + d4 ;
            dl3(2);
        }
        static void ff(int i)
        {
            Console.WriteLine("ff");
        }
        static void FFF(int i)
        {
            Console.WriteLine("FFF");
        }
    }
            //在使用 连加时候 无论是委托还是 方法名 都必须与定义的委托保持一致。
            //委托连加的实质就是调用了Delegate.Combine()方法
-----------------------------------------------------------------
    //class Phone
    //{
    //}
    //class Mobile : Phone
    //{
    //}
    //delegate Phone PhoneDele(Mobile m);
    //像定义方法签名一样定义委托
    //class Program
    //{
    //    static void Main(string[] args)
    //    {
    //        Program pro = new Program();
    //        PhoneDele pd1 = pro.GetPhone;
    //        PhoneDele pd2 = pro.GetMobile;--协变
    //        pd2(new Mobile ());
    //    }
    //    public Phone GetPhone(Mobile m)
    //    {
    //        return null;
    //    }
    //    public Mobile GetMobile(Phone f)
    //    {
    //        return null;
    //    }
    //    public Phone GetPhone(Phone f)
    //    {
    //        return null;
    //    }
    //    public Mobile GetMobile(Mobile m)
    //    {
    //        return null;
    //    }
    //}   
    //class Phone
    //{ }
    //class Mobile : Phone
    //{ }
    //delegate void PhoneDele(Mobile pho);
    //class Program
    //{
    //    static void Main(string[] args)
    //    {
    //        Program pro = new Program();
    //        PhoneDele pd1 = pro.SetPhone;//委托类型的逆变
    //        PhoneDele pd2 = pro.SetMobile;
    //        pd1(new Mobile());
    //    }
    //    public void SetPhone(Phone pho)
    //    { }
    //    public void SetMobile(Mobile mob)
    //    { }
    //
    1: 方法不必与委托签名完全匹配 ,但是方法的签名必须具有继承关系,无论是 返回值还是参数类表
    2: 什么是协变是 是委托的返回值与方法的返回值 如果前者返回值类型是后者返回值类型的父类就可以 否则不行,协变只发生在返回值有继承关系的委托赋值过程(即把方法赋给委托变量)
    3: 什么是逆变是 把一个方法给委托变量,委托的参数类型一定是方法中参数的的子类。
          逆变只发生在委托参数和方法参数有继承关系的委托赋值过程。
      那么在调用委托的时候,传给委托的参数是被调用的方法的参数的子类,一个子类赋给父类对象是符合c#语法规范的

你可能感兴趣的:(学习,职场,笔记,委托,休闲)