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     }

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

  • 相关阅读:
    每日日报2020.12.1
    每日日报2020.11.30
    981. Time Based Key-Value Store
    1146. Snapshot Array
    565. Array Nesting
    79. Word Search
    43. Multiply Strings
    Largest value of the expression
    1014. Best Sightseeing Pair
    562. Longest Line of Consecutive One in Matrix
  • 原文地址:https://www.cnblogs.com/hrx521/p/12128719.html
Copyright © 2011-2022 走看看