委托是一种应用方法的类型,一旦为委托分配方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有返回值。

委托的签名(有返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。方法可以是静态和实例化只要知道委托的签名就可以为自己分配委托方法。委托具有以下特点:

1、委托类似与C++函数指针,但他们类型是安全的。

2、委托允许将方法作参数进行传递。

3、委托可用于定义回调方法()。

4、委托可以连接在一起,一个事件调用多个方法

5、方法不必与委托签名完全匹配

委托的定义:

delegate void Dele(int i);

方法的定义

public void Method(int i)

{

       Console.WriteLine(”参数为:{0}”i);

}

委托与方法关联:
Program pro=new Program();

Dele dele=new Dele(pro.Method);

dele(100);

委托是密封的,不能从Delegates中派生委托类型,也不可能从派生自定义类。

实例化一个委托,所以可以将其作为参数进行传递,也可以将其赋值给属性。

方法便可以将一个委托作为参数来接受,并且以后可以调用该委托。这称为异步回调。

在方法重载的上下文中,方法的签名不包括返回值。但在委托的上下文中,签名的确包括返回值。

定义委托:

    delegate void Del(int i);

    class Program

    {

        static void Main(string[] args)

        {

            //实例化的方法  在静态方法调用时必须先初始化一个参数再调用         

            Program a = new Program();

            Del del = new Del(Ment);//调用Ment的方法

           // del += Ment;//调用Ment的方法,与上一个作用相同,方式不一样。

            //Del del2 = a.FF ;//调用方法类型为public的方法

            Del del2 = new Del(FF);//调用FF的方法方法类型为static

            del2 += FF;//调用FF的方法

            Del del3 = delegate(int i) { Console.WriteLine("wu"); Console.WriteLine(i); };//委托调用匿名方法

            Del del4 = del + del2 + del3;//

            Del del5 = new Del(Dy);

            del4 += del5;//del4调用Dy方法

           // del4 = del5;//del5赋给del4,其他全部没有了

            del4 += DY;//del4调用del,del2,del3,del5的方法

            del4(100);

            //Myclass mc = new Myclass();

            //mc.Method(del);//调用实例化委托

        }

        static void Dy(int j)

        {   Console.WriteLine("j");  Console.WriteLine(j);  }

        static void DY(int k)

        { Console.WriteLine("静态"); Console.WriteLine(k); }

        //定义与委托参数相同的方法

        static void Ment(int i)

        { Console.WriteLine("Ment:"); Console.WriteLine(i); }

        static   void FF(int i)

        { Console.WriteLine("ff"); Console.WriteLine(i); }

    }

    class Myclass

    {

        public void Method(Del del)//实例化委托

        {

            del(12345);

        }

    }

}

委托的协变与异变:委托的协变与异变其本质就是把子类型赋给父类型的过程,只是协变与异变的过程相反,协变就是把子类的值赋给父类

class Phone

    {    }

    class Mobile : Phone

    {    }

    delegate Phone PhoneDele();

    class Program

    {

        static void Main(string[] args)

        {

            Program pro = new Program();

            PhoneDele pd1 = pro.GetPhone;

            PhoneDele pd2 = pro.GetMobile;//委托类型的协变

        }

        public Phone GetPhone()

        {    return null;   }

        public Mobile GetMobile()

        {     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;

    }

    public void SetPhone(Phone pho)

    { }

   public void SetMobile(Mobile mob)

   { }