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

    委托:delegate是表⽰将⽅法作为参数传递给其他⽅法。委托类似于函数指针,但与函数指针不同的是,委托是⾯向对象
       的、类型安全的和保险的。 委托既能引⽤静态⽅法,也能引⽤实例⽅法。

       委托是⼀个类,它定义了⽅法的类型,使得可以讲⽅法当做另⼀⽅法的参数来进⾏传递,这种将⽅法动态地赋给参
       数的做法,可以避免在程序中⼤量使⽤IF-Else( Switch)语句,同时使程序具有更好的可扩展性。

        委托对象的⼀个有⽤属性是:可以使⽤ + 运算符将多个对象分配给⼀个委托实例。多播委托包含已分配委托的
        列表。 在调⽤多播委托时,它会按顺序调⽤列表中的委
        托。 注意: 只能合并相同类型的委托。

        当使⽤事件设计模式时。
        当封装静态⽅法可取时。
        当调⽤⽅不需要访问实现该⽅法的对象中的其他属性、⽅法或接⼝时。
        需要⽅便的组合
        当类可能需要该⽅法的多个实现时。

         委托的声明原型如下:
      delegate <函数返回类型> <委托名> (<函数参数>)
         委托的使⽤分以下三步:
          1.委托声明
          2.委托实例化

          3.委托的调用
          

    class Program
        {
            public delegate void Greeting(string name);
            public static void EnglishGreeting(string name)
            {
                Console.WriteLine("Good morning!~" + name);
            }
            public static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好!~" + name);
            }
    
            static void Main(string[] args)
            {
                Greeting greet;
                greet = ChineseGreeting;
                greet += EnglishGreeting;
                greet("张三");
    
                Greeting gre = new Greeting(ChineseGreeting);
                gre += EnglishGreeting;
                gre("张三");
      
            }
        }

    事件:类或对象可以通过事件向其他类或对象通知发⽣的相关事情。 发送(或引发)事件的类称为“发⾏者”,接收(或处理)事件的类称为“订户”。
    注意: C#事件本质就是对消息的封装。

    由来:委托在某种程度上,破坏了对象的封装性。委托第⼀个⽅法注册⽤的是“=”,是赋值语句,因为要进⾏实例
       化,第⼆个⽅法注册的时候⽤的是“+=”。但是,不管是赋值还是注册,都是将⽅法绑定到了委托上,除了调⽤
       时的先后顺序不同,在没有任何的区别。这样使⽤起来很别扭,于是event,出场了!

       是事件封装了委托类型的变量,相当于为委托类型量⾝定制的属性( Property)。
    优点:在类的内部,不管声明它是public还是protected,他总是private的。
       在类的外部,注册“+=”和注销“-=”的访问限定符与声明事件时使⽤的访问限定符相同。

    class Program
        {
            
            public delegate void Greeting(string name);
            public class GreetingManger
            {
                public event Greeting MakeGreet;
                public void GreetPeople(string name)
                {
                    MakeGreet(name);
                }
            }
    
            public static void EnglishGreet(string name)
            {
                Console.WriteLine("Good Morning!~" + name);
            }
            public static void ChineseGreet(string name)
            {
                Console.WriteLine("早上好!" + name);
            }
    
            static void Main(string[] args)
            {
                
                GreetingManger gre = new GreetingManger();
                gre.MakeGreet += EnglishGreet;
                gre.MakeGreet += ChineseGreet;
                gre.GreetPeople("张三");
    
            }
        }

    c#阶段至此基本上就告一段落了       接下来是地狱 U-3D  

    有点小激动呢

  • 相关阅读:
    跟着我学习-python-01-流程控制语句
    跟着我学习-python-01-用户交互
    跟着我学习-python-02-while循环
    基于Centos7.6上Ambari2.7.4+HDP3.1.4离线安装
    TDH(Transwarp Data Hub)社区版安装教程
    跟我学习日常写的shell脚本-设置系统selinux
    [Linux]常用命令“ll”失效或命令未找到
    NPOI
    Linq&lamda相关
    接口相关
  • 原文地址:https://www.cnblogs.com/little-sun/p/4351752.html
Copyright © 2011-2022 走看看