委托,事件

委托: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  

有点小激动呢

原文地址:https://www.cnblogs.com/little-sun/p/4351752.html