C#委托和事件学习笔记

  1. 什么叫委托

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
定义完了后,举个例子来说明下,委托是如何使用得。先定义一个委托在用两个方法用来打招呼,
委托类型声明:

(1) 以deleagate关键字开头。

(2)返回类型+委托类型名+参数列表。

public delegate void GreedinDelegate(string name);
 
   private static void SpeakEnglish(string name)
   {
       Console.WriteLine("good Morning," + name);
   }
   private static void SpeakChinese(string name)
   {
       Console.WriteLine("zao," + name);
   }
 private static void GreetPeople(string name, GreedinDelegate MakeGreeding)
        {
            MakeGreeding(name);
        }
        static void Main(string[] args)
        {
            GreetPeople("zang", SpeakEnglish);
            GreetPeople("zeng", SpeakChinese);
            Console.ReadLine();
        }

在这里插入图片描述
知道委托是将方法作为参数来传递的。可以改进为

 static void Main(string[] args)
        {
            GreedinDelegate d1, d2;
            d1 = SpeakEnglish;
            d2 = SpeakChinese;
            GreetPeople("zhang", d1);
            GreetPeople("zeng", d2);
            Console.ReadLine();
        }

运行结果同样。委托还有一个特性,可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,当调用这个委托的时候,将依次调用其所绑定的方法。将上述的例子修改如下

 static void Main(string[] args)
        {
            GreedinDelegate d1;
            d1 = SpeakEnglish;
            d1 += SpeakChinese;
            GreetPeople("zhang", d1);
            Console.ReadLine();
        }
        输出结果
        good Morning,zhang
        zao,zhang

通过符号 += 将方法和委托绑定,反向 -= 可以将方法从委托上解绑。

 static void Main(string[] args)
        {
            GreedinDelegate d1;
            d1 = SpeakEnglish;
            d1 += SpeakChinese;
            GreetPeople("zhang", d1);
            d1 -= SpeakChinese;
            GreetPeople("zhang", d1);
            Console.ReadLine();
        }
        结果
        good Morning,zhang
        zao,zhang
        good Morning,zhang
  1. 事件 Event
    在委托中,为了更好的操作,符合数据安全的原因,于是对委托进行封装,这就是事件。在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。声明一个事件不过类似于声明一个进行了封装的委托类型的变量。
    将上面的例子修改下
 public class GreetingManager
    {
        public event GreedinDelegate MakeGreet;
        public  void GreetPeople(string name)
        {
            MakeGreet(name);
        }
    }
    
    class Program
    {

        private static void SpeakEnglish(string name)
        {
            Console.WriteLine("good Morning," + name);
        }
        private static void SpeakChinese(string name)
        {
            Console.WriteLine("zao," + name);
        }
       
        static void Main(string[] args)
        {
            GreetingManager gm = new GreetingManager();
            gm.MakeGreet = SpeakEnglish;//这里编译报错,提示只能通过+=或者-=操作,这说明现在不能对这个进行赋值了。
            gm.MakeGreet += SpeakChinese;
            gm.GreetPeople("zhang");
        }
    }

结论:事件是委托的封装,也是委托。

猜你喜欢

转载自blog.csdn.net/weixin_45072334/article/details/106281264
今日推荐