当前位置 博文首页 > God_Y:C#基础知识学习之 ? “精神小伙“——委托(delegate) 的

    God_Y:C#基础知识学习之 ? “精神小伙“——委托(delegate) 的

    作者:[db:作者] 时间:2021-07-04 22:01

    C#委托(Delegate)

    在C#的学习过程中,自然有我们的精神小伙——委托 的一席之地
    本文就介绍一下C#中的委托,这位可以包含同类方法函数的小伙子

    C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。 委托(Delegate)
    是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。 委托就是用来储存方法的结构
    委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 System.Delegate 类。

    声明和定义委托分为4个步骤

    1. 声明一个委托(函数指针)
    2. 创建委托对象
    3. 创造符合委托格式的函数(指针指向的函数)
    4. 将函数名称赋值给委托

    Tips:委托对象为空是不能执行的,执行前先提前判断

    代码实例如下

    // 1. 声明一个委托(函数指针)
    delegate void delegateTest(int a,float b);
    // delegate 返回值类型 委托类型名(参数列表):
    
    // 2. 创建委托对象 
    public delegateTest dT1;
    
    //3. 创造符合委托格式的函数(指针指向的函数)
    public void Test(int a,float b)
    {
        a+=100;
        b*=2.0;
        Console.WriteLine("a:{0},b:{1}", a,b);
    }
    
     static void Main(string[] args)
    {
        // 4.  将函数名称赋值给委托
        dT1=new delegateTest(Test);
        //使用委托
        dT1(1,1.0);
        
        //打印结果
        //a=101,b=2.0
    }
    

    委托类型

    1. 委托/代理:句柄
    2. 委托是自定义类型
    3. 委托是引用类型

    几种基础的委托结构

    1. 自定义委托 语法: delegate 返回类型 委托名([参数]);
    2. Action内置委托 语法: Action<[参数类型0-16个]> 委托名=被委托方法名;
    3. Func内置委托 语法: Function<[参数类型0-16个],返回类型> 委托名=被委托方法名;
    4. 多播委托 语法:委托名+=被委托方法名;委托名-=被委托方法名;

    委托的用法

    下面的实例演示了委托的一个用法,可以将定义的委托作为参数,就可以直接通过委托来调用委托中的方法了。

    //声明委托
    public delegate void OndelegateTest(int a,int b);
    
           public static void TestNum1(int i,int j)
          {
             int num = i+j;
             Console.WriteLine("num:"+num);
          }
           public static void TestNum2(int i,int j)
          {
             int num = i*j;
             Console.WriteLine("num:"+num);
          }
          
          // 该方法把委托作为参数,并使用它调用方法
          public static void sendNum(OndelegateTest test)
          {
             test(1,2);
          }
          
    static void Main(string[] args)
     {
          OndelegateTest d1=new OndelegateTest(TestNum1);
          OndelegateTest d2=new OndelegateTest(TestNum2);
          sendNum(d1);
          sendNum(d2);
          Console.ReadKey();
     }
    
    
    

    委托的多播(Multicasting of a Delegate)

    委托对象可使用 “+” 运算符进行合并。一个合并委托调用它所合并的两个委托。只有相同类型的委托可被合并。"-" 运算符可用于从合并的委托中移除组件委托。

    使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。这被称为委托的 多播(multicasting),也叫组播。下面的程序演示了委托的多播:

    using System;
    //声明委托
    delegate int NumberChanger(int n);
    namespace DelegateAppl
    {
       class TestDelegate
       {
          static int num = 10;
          public static int AddNum(int p)
          {
             num += p;
             return num;
          }
    
          public static int MultNum(int q)
          {
             num *= q;
             return num;
          }
           public static int TestNum(int i)
          {
             num -= i;
             return num;
          }
          public static int getNum()
          {
             return num;
          }
    
          static void Main(string[] args)
          {
             // 创建委托实例
             NumberChanger nc;
             NumberChanger nc1 = new NumberChanger(AddNum);
             NumberChanger nc2 = new NumberChanger(MultNum);
             nc = nc1;
             nc += nc2;
             nc += TestNum;
             // 调用多播
             nc(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }
    

    当上面的代码被编译和执行时,它会产生下列结果:

    Value of Num: 70

    委托对象的绑定与解绑

         delegate int NumberChanger(int n);
         NumberChanger nc;
         
         public static int TestNum(int i)
          {
             num -= i;
             return num;
          }
          
         nc += TestNum;//委托的绑定
         nc -= TestNum;//委托的解绑
    
    cs