• C# 委托及各种写法


    • 委托是神马?

    委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法)。通俗的说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指的方法。

    • 如何使用委托?

    1、定义委托类型

    [访问修饰符]delegate 返回类型 委托名(形参);

    2、声明委托对象

    委托名 委托实例名;

    3、创建委托对象(确定与哪些方法进行绑定)

    委托实例名=new 委托名(某个类的方法)

    4、使用委托调用方法

    委托实例名(实参)

    • 委托注意事项:

    1、委托和方法必须具有相同的参数。

    2、委托可以调用多个方法,即一个委托对象可以维护一个可调用方法的列表而不是单独的一个方法,称为多路广播(多播)。

    3、使用+=和-=运算实现方法的增加和减少

    • 示例
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Delegate;

    namespace Delegate
    {

    public delegate int Call(int num1, int num2);//第一步:定义委托类型
    class SimpleMath
    {
    // 乘法方法
    public int Multiply(int num1, int num2)
    {
    return num1 * num2;
    }

    // 除法方法
    public int Divide(int num1, int num2)
    {
    return num1 / num2;
    }
    }
    }
    class Test
    {
    static void Main(string[] args)
    {
    Call objCall;//第二步:声明委托对象
    // Math 类的对象
    SimpleMath objMath = new SimpleMath();
    // 第三步:创建委托对象,将方法与委托关联起来
    objCall = new Call(objMath.Multiply);

    Call objCall1 = new Call(objMath.Divide);
    objCall += objCall1;//向委托增加一个方法
    //objCall -= objCall1;//向委托减去一个方法
                // 调用委托实例,先执行objMath.Multiply,然后执行objMath.Divide
    int result = objCall(5, 3);
    System.Console.WriteLine("结果为 {0}", result);
    Console.ReadKey();
    }
    }
     

    写法:

    1、委托 委托名=new 委托(会调用的方法名); 委托名(参数);

    2、委托 委托名 =会调用的方法名; 委托名(参数);

    3、匿名方法

    委托 委托名=delegate(参数){会调用的方法体};委托名(参数);

    4、拉姆达表达式

    委托 委托名=((参数1,。。参数n)=>{会调用的方法体});委托名(参数);

    5、用Action<T>和Func<T>,第一个无返回值

    Func<参数1, 参数2, 返回值> 委托名= ((参数1,参数2) => {带返回值的方法体 });返回值=委托名(参数1,参数2);

    贴代码:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using @delegate;
     6  
     7 namespace @delegate
     8 {
     9         public delegate int Call(int num1, int num2);
    10         class SimpleMath
    11         {
    12             // 乘法方法
    13             public static int Multiply(int num1, int num2)
    14             {
    15                 return num1 * num2;
    16             }
    17  
    18             // 除法方法
    19             public int Divide(int num1, int num2)
    20             {
    21                 return num1 / num2;
    22             }
    23         }
    24     class Test
    25     {
    26         static void Main(string[] args)
    27         {
    28             //--------------------第一种写法------------------------//
    29             //Call objCall = new Call(SimpleMath.Multiply);
    30             //Call objCall1 = new Call(new SimpleMath().Divide);
    31             //--------------------第二种写法------------------------//
    32             //Call objCall = SimpleMath.Multiply;
    33             //Call objCall1 = new SimpleMath().Divide;
    34             //--------------------第三种写法------------------------//
    35             //Call objCall = delegate(int a, int b)
    36             //{
    37             //    return a * b;
    38             //};
    39             //Call objCall1 = delegate(int a, int b)
    40             //{
    41             //    return a / b;
    42             //};
    43             //--------------------第四种写法------------------------//
    44             //Call objCall =((int a,int b)=> { return a*b;});
    45             //Call objCall1 = ((int a, int b) => { return a / b; });
    46             //--------------------第五种写法------------------------//
    47             Func<int, int, int> objCall = ((a, b) => { return a * b; });
    48             Func<int, int, int> objCall1 = ((a, b) => { return a / b; });
    49              Action<int, int> ob = ((a, b) => { Console.WriteLine(a * b); });
    50              ob(5, 3);
    51             //----------------------------------------------------//
    52              int result = objCall(5, 3);
    53              int result1 = objCall1(5, 3);
    54              System.Console.WriteLine("结果1为 {0},结果2为{1}", result,result1);
    55             Console.ReadKey();
    56         }
    57     }
    58 }
  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/zhangchengye/p/5430970.html
Copyright © 2020-2023  润新知