zoukankan      html  css  js  c++  java
  • 【C#复习总结】细说委托

    1 前言

    本系列会将【委托】 【匿名方法】【Lambda表达式】 【泛型委托】 【表达式树】 【事件】等基础知识总结一下。(本人小白一枚,有错误的地方希望大佬指正)

    系类1:细说委托

    系类2:细说匿名方法

    系列3:细说Lambda表达式

    系列4:细说泛型委托

    系列5:细说表达式树

    系列6:细说事件

    前几天看到博客园一个前辈写了一篇文章用五分钟重温委托,匿名方法,Lambda,泛型委托,表达式树”,文章写的非常好,推荐阅读一下,正所谓“前人栽树,后人乘凉”,在这我就站在巨人的肩上,再将这几个概念加上“事件”这一概念在复习一遍,一来是加深记忆,二来方便后来人学习,本人小白一枚,有错的地方希望老司机指正。

    什么是委托

    委托是一个类,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。

    3 初识委托

    我们知道委托是一个引用类型,所以它具有引用类型所具有的通性。它保存的不是实际值,而是保存对存储在托管堆(managed heap)中的对象的引用。那它保存的是对什么的引用呢?委托保存的是对函数(function)的引用。

    对学过C/C++的人,是不是觉得跟函数指针很像呢!委托可以引用实例和静态(在 Visual Basic 中为 Shared)方法,而函数指针只能引用静态方法。 其实它们是有区别的,在非托管C/C++中,函数的地址就是一个内存地址。该地址不会携带任何额外的信息,例如函数期望的参数个数、参数类型、函数的返回值类型及函数的调用约定。总之,非托管C/C++中函数指针是非类型安全的。.NET中的委托是类型安全的,委托会检测它所保存的函数引用是否和声明的委托匹配。

    4 委托的使用

    在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。

    下边的代码,完成了一个委托使用的演示。一个委托分三个步骤:

    step01:首先用delegate定义一个委托 。

    step02:声明一个方法来对应委托。

    step03:用这个方法来实例化这个委托。

    namespace Delegate
    {
        class Program
        {
            //step01:首先用delegate定义一个委托 。
            public delegate int CaculateAdd(int x, int y);
            static void Main(string[] args)
            {
                //step03:用这个方法来实例化这个委托。
                CaculateAdd add1 =new  CaculateAdd(Add);
              
                  //int result = cAdd.Invoke(5, 6);
                int result = add1(4, 5);
    
    
                Console.WriteLine(result);
                Console.ReadKey();           
            }
            // step02:声明一个方法来对应委托。
            public static int Add(int x,int y)
            {
                return x + y;
            }
        }
    }

    到这里,你就基本上会用委托了。是不是很简单。

    来解析一下委托类:

    当我们用delegate关键字声明委托时,编译器自动为我们生成类

    类的名字即为委托变量名,访问类型为定义的委托访问类型

    如:

    public delegate int CaculateAdd(int x, int y);定义的委托对应的类为 CaculateAdd,访问类型为public,该类继承自[mscorlib]System.MulticastDelegate

    如果我们定义委托的访问类型为private或者protected,则对应的委托类的访问类型为private或者protected

    但是任何委托都继承自[mscorlib]System.MulticastDelegate

    5 委托的多播(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 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(5);
             Console.WriteLine("Value of Num: {0}", getNum());
             Console.ReadKey();
          }
       }
    }

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

    Value of Num: 75

    6 总结

    至此,委托的基本知识和应用就已经很清楚了。下一篇将介绍匿名方法。详见:

    参考文献:

    博客

    菜鸟

    百度百科

    友情提示

    作者: mhq_martin

    博客园地址: http://www.cnblogs.com/mhq-martin/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    for循环嵌套的原理
    php for循环|求1-100之间被3整除且被5不整除的偶数
    php 1-100之间能被3整除的数字之和;
    php判断某年某月有多少天
    关系运算符
    变量
    习题5-7 使用函数求余弦函数的近似值
    习题5-6 使用函数输出水仙花数
    习题4-11 兔子繁衍问题
    习题4-9 打印菱形图案
  • 原文地址:https://www.cnblogs.com/mhq-martin/p/9057897.html
Copyright © 2011-2022 走看看