C#委托

1、定义

      委托(delegate)是一种引用类型,我们在处理他的时候要当作类来看待而不是方法,说白了委托就是对方法或者方法列表的引用。
      调用一个委托实例就好像是调用c++中的指针一样,他封装了对制定方法的引用,或者说委托起到的是桥梁的作用,实例后的委托对象会将给定的参数传递给他所回调的方法,并去执行方法。

2、委托的声明原型 

       delegate <函数返回类型> <委托名> (<函数参数>)
       public delegate void CheckDelegate(int number);
       委托在.net内相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此。

3、委托实例化的原型

     <委托类型> <实例化名>=new <委托类型>(<注册函数>)
    CheckDelegate checkDelegate=new CheckDelegate(CheckMod);

4、创建步骤

      (1)声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
      (2)创建delegate对象,并"将你想要传递的函数作为参数传入"。
      (3)通过上一步创建的对象来调用方法。


     案例一


  // 步骤1,声明delegate对象
 public delegate void BuyTicketDelegate();
 class Test
    {
      public static void BuyTicket()
        {
            Console.WriteLine("每次都让我去买票,鸟人呀!");
        }
        static void Main(string[] args)
        {
            // 步骤2,创建Get对象
            BuyTicketDelegate get = new BuyTicketDelegate(Test.BuyTicket)
           // 步骤3,调用get
            get();
         }

}

  案例二


public delegate void DelegateUtil(string sName); 
class DelegateUtilClass
    {
         static void Main(string[] args)
        {
            Console.WriteLine("输出结果是:");
            DelegateUtil du = new DelegateUtil(DelegateUtilClass.OutPut); 
            du("I'm learning delegate now !");
        }

//这是想要传递的方法,该方法与定义的委托(即DelegateUtil)具有相同的参数和返回值类型,函数名是不一样!


        public static void OutPut(string sName)
        {
            Console.WriteLine("Hi, " + sName);
        }

      可以直接用匹配的函数实例化委托:

    <委托类型> <实例化名>=<注册函数>

     DelegateUtil du = OutPut(I'm learning delegate now !);


5、多播委托

       如果委托包含了多个方法的调用,这种委托就被称为多播委托。当使用多播委托时,就可以按顺序连续调用多个方法。
       委托可以用运算符“+”串在一起,也可以用运算符“-”从多播委托中删除。


       案例三


 delegate void MyDelegate(int a, int b);
    class MyTest{
        static void Add(int a, int b) {
            Console.WriteLine(a + b);
        }
        static void Sub(int a, int b)
        {
            Console.WriteLine(a - b);
        }
        static void Main(string[] args)
        {
            MyDelegate md;
            MyDelegate md1 = new MyDelegate(Add);
            MyDelegate md2 = new MyDelegate(Sub);
            md = md1 + md2;
            //md = md1 - md2;
            md(1,2);
        }
    }


6、Action<T> 委托

      案例四


class Test
    {
      public static void BuyTicket()
        {
         Console.WriteLine("每次都让我去买票,鸟人呀!");
        }
        static void Main(string[] args)
        {
                  Action act = BuyTicket;
                  act();
        }
}


    案例五


class Test
    {
      public static void BuyTicket(string s)
        {
            Console.WriteLine(s);
        }
        static void Main(string[] args)
        {
                  Action<string> act = BuyTicket;
                  act("每次都让我去买票,鸟人呀!");
        }
}


7、Func<T>委托

      它和Action<T>的区别就是没有返回值

public static string HelloEnglish(string strEnglish)  

 return "Hello." + strEnglish;  

}  

Func<stringstring> f = HelloEnglish;  

Console.WriteLine(f("English"));  





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值