zoukankan      html  css  js  c++  java
  • C#委托的最简单入门和理解

     
      委托是.net语言中非常重要的一个概念,初学不太好理解也没有关系的,在一次一次的攻关后会领会到委托的精妙,可以说 .net 没有委托就没有后面更高级的事件,异步多线程等等特性的形成可能。所以一定要认真的对待.net语言中的这一重要概念。
      委托实例就是方法的指针,它指向一个或一组方法,调用一个委托的Invoke()方法就会把它指向的那个方法都执行一遍
      初学时要注意对委托和委托实例的理解,委托是约束它所指向方法的返回值和参数,相当于我们在操作变量时对变量的声明;委托实例则相当于是带有具体约束的委托的变量,它实例化了一个委托,这种实例化相当于我们实例化一个类时用new class1();这种方式所做的工作。
      可以先把泛型的概念放到一边,否则我们要啃的山头就更大了,并且泛型是.net后期才出现的,而委托这一概念在没有泛型的早期也就早已经使用的很普遍了。 
     1     public class 计算器类
     2     {
     3         //声明一个具体的委托类型mydelegate,它规定绑定到它这种类型的变量的方法的返回值是一个decimal类型
     4         //同时它也规定绑定到它这种类型的变量的方法的返回值是两个decimal类型
     5         public delegate decimal mydelegate(decimal m, decimal n);
     6         //接下来有两个方法符合上面的返回值和入参的规范:
     7         static decimal Operation1(decimal x, decimal y)
     8         { return x + y; }
     9         static decimal Operation2(decimal x, decimal y)
    10         { return x * y; }
    11         public mydelegate 算法;
    12         void XX()
    13         {
    14             //接下来是实例化一个委托,也就是把方法绑定到具体委托类型(mydelegate)的变量(算法)
    15             算法 = new mydelegate(Operation1);
    16             //使用+=操作符把多个方法绑定给一个委托类型(mydelegate)的变量
    17             算法 += new mydelegate(Operation2);
    18         }
    19         public decimal ExecuteOperation(decimal a, decimal b)
    20         {
    21             return 算法.Invoke(a, b);
    22         }
    23     }
    24     //2.委托对面向对象多态的体现:在下面 客户端运算类中 我们只需要传给计算器类的委托实例【算法】一个具体的算法(相减),
    25     //则计算器类就能在不改动的情况下拥有新的算法能力
    26     public class 客户端运算
    27     {
    28         计算器类 jsq1 = new 计算器类();
    29         //在计算器类中并没有的新的算法:相减
    30         public decimal 相减(decimal x, decimal y)
    31         { return x - y; }
    32         void 指示计算器做减法()
    33         {
    34             //把方法绑定给委托实例
    35             jsq1.算法 += 相减;
    36             Console.WriteLine(jsq1.算法.Invoke(5, 6));
    37         }
    38 
    39 
    40         //我们还可以这样做,调用外部封装好的算法方法,然后把这个方法成员绑定给委托实例,比如
    41         void 指示计算器做除法()
    42         {
    43             //把单独类中的方法成员绑定给委托实例
    44             jsq1.算法 += new 除法算法类().相除;
    45             Console.WriteLine(jsq1.算法.Invoke(20, 5));
    46         }
    47     }
    48     //把除法封装在一个单独的类中的方法成员:相除
    49     public class 除法算法类
    50     {
    51         public decimal 相除(decimal x, decimal y)
    52         { return x / y; }
    53     }

     如有理解错误的地方,欢迎大家拍砖指正。

  • 相关阅读:
    012 字典
    011 递归
    010 函数与闭包
    009 格式化
    000 机器学习的概念原理
    008 元组
    007 列表
    005 Numpy的基本操作
    071 SparkStreaming与SparkSQL集成
    070 DStream中的transform和foreachRDD函数
  • 原文地址:https://www.cnblogs.com/hrx521/p/12128719.html
Copyright © 2011-2022 走看看