zoukankan      html  css  js  c++  java
  • 委托与事件——委托

      C#中的委托与事件是很重要的概念,要学好C#,必须冲破这一关。

    1.委托  

      关键字delegate,委托,它与类、枚举、结构、接口一样,也是一种类型

      由于委托是代表了一类具有相同参数列表和返回值的函数委托定义的变量用于保存具有相同签名的函数实体,它可以指代任何函数。所以,我们说类是对象的抽象,那么委托就可以看成是函数的抽象

      委托的好处:

        1.将方法动态地赋给参数,可以避免在程序中大量使用if-else(switch-case)语句,使程序具有良好的可扩展性。

        2.可以把函数本身的处理逻辑抽象出来,由调用者决定最终使用什么样的逻辑去处理。

      委托的用法,请看下面的代码

     1         //委托与类、枚举、结构、接口一样,也是一种类型
     2         //一个委托代表了具有相同参数列表和返回值的所有函数
     3         delegate int GetCalculatedValueDelegate(int x, int y);
     4         delegate void GreetingPeople();
     5 
     6         static int AddValue(int x,int y) 
     7         {
     8             return x + y;
     9         }
    10 
    11         static int SubValue(int x, int y)
    12         {
    13             return x - y;
    14         }
    15 
    16         static int MulValue(int x, int y)
    17         {
    18             return x * y;
    19         }
    20 
    21         static void EnglishGreating() 
    22         {
    23             Console.WriteLine("Hello");
    24         }
    25 
    26         static void ChineseGreeting() 
    27         {
    28             Console.WriteLine("你好");
    29         }
    30 
    31         //委托作为函数的参数来使用
    32         //一个委托实体可以指代任何函数
    33         static int CalculateValue(GetCalculatedValueDelegate fun,int x,int y)
    34         {
    35             return fun(x, y);
    36         }
    37 
    38         static void Main(string[] args)
    39         {
    40             Console.WriteLine("委托作为参数来使用");
    41             Console.WriteLine(CalculateValue(SubValue, 50, 20));
    42 
    43             Console.WriteLine("委托使用 += 和 -=");
    44             GetCalculatedValueDelegate de = new GetCalculatedValueDelegate(AddValue);
    45             de += SubValue;
    46             de -= AddValue;//取消对AddValue方法的绑定
    47             Console.WriteLine(de(20, 20));
    48 
    49             Console.WriteLine("给一个委托绑定多个方法");
    50             GetCalculatedValueDelegate d = AddValue;//给委托赋值
    51             d += SubValue; //给委托再绑定一个函数
    52             d += MulValue; //给委托再绑定一个函数
    53             Console.WriteLine(d(100, 30));
    54 
    55             GreetingPeople greeting = null;
    56             greeting += EnglishGreating;
    57             greeting += ChineseGreeting;
    58             greeting();
    59         }

    运行结果:

      因为委托也是一种类型,所以我们可以进行操作的运算符主要有 = (赋值操作) += (把一个方法绑定到一个委托变量上)-=(取消绑定)。 要注意的是:无返回值的委托,你给它注册多少个方法,它就执行多少个方法,而有返回值的委托,同样注册多少个方法就执行多少个方法,但返回的是最后一个方法的返回值。所以上面的程序中,我们给委托d绑定了3个有返回值的方法,但最终返回的是MulValue的返回值;我们给委托greeting绑定了2个方法,最终我们看到了这两个方法的执行结果。

      关于委托的+=和-=的工作原理,请查看  http://www.jb51.net/article/59449.htm

      委托的缺点:在上面的程序中,我们可以随意地给委托进行赋值,破坏了程序的封装性,所以接下来该事件出场了。

      接下来请看:委托与事件——事件。

     

  • 相关阅读:
    SQL Union和SQL Union All用法
    background:url() 背景图不显示
    媒体查询_网页打印样式
    提示让IE8以下版本的浏览器去更新浏览器
    python_继承supper错误
    Django_xadmin_应用外键搜索功能错误
    Django_404_403_500页面处理
    Django_中国化
    Django_上传图片和模版获取图片
    Django_生产环境静态文件配置
  • 原文地址:https://www.cnblogs.com/lcxBlog/p/4495894.html
Copyright © 2011-2022 走看看