一眼就能看懂的C#委托、多播委托和事件的区别与联系。

先说结论函数

委托:spa

1.一种能够把函数名当参数传递的类型code

2.能够经过delegateName()直接触发对象

3. 能够赋值。blog

多播委托:事件

1能够传递多个函数名,调用时会运行多个函数string

2.能够经过delegateName()直接触发it

3.能够赋值。io

事件:event

1.相似多播委托,本质更像是委托的一个实例,可是具备封装性。

2.不能像委托同样直接触发,只能经过事件相关函数触发。

3.不像委托同样能够直接赋值,可是能够经过+= 和 -=增长和移除函数。

4.能够实现发布订阅者模式。

 

委托实例(标粗注意):

咱们但愿给委托加一个事件,一个中国人问好,而且触发委托

class Program { public delegate void SayDelegate(string name); public class ChinesePeople { public void SayChinese(string name) { Console.WriteLine("你好" + name); } public void Greet(string name, SayDelegate action) {  action(name); } } static void Main(string[] args) { string name = "张三"; ChinesePeople cp = new ChinesePeople();
       //给委托赋值 SayDelegate delegate1
= cp.SayChinese;
       //只传一个函数名时,两种写法均可以
       delegate1(name); cp.Greet(name,delegate1); cp.Greet(name,cp.SayChinese);
        Console.ReadKey(); } }

结果:

你好张三
你好张三
你好张三


多播委托实例一:

咱们但愿委托让一个中国人和一个英国人问好,这时候咱们经过+=添加函数。

public delegate void SayDelegate2(string name); public class ChinesePeople { public void SayChinese(string name) { Console.WriteLine("你好" + name); } } public class EnglishPeople { public void SayEnglish(string name) { Console.WriteLine("hello" + name); } } class Program { static void Main(string[] args) { string name = "张三"; ChinesePeople cp = new ChinesePeople(); EnglishPeople ep = new EnglishPeople(); SayDelegate2 delegate1 = cp.SayChinese; delegate1 += ep.SayEnglish; delegate1(name); Console.ReadLine(); } }

结果:

你好张三
hello张三

 

多播委托实例二:

delegate1(name)看起来太简洁了,咱们根本不知道这个委托是要干什么的, 若是咱们跟第一个同样,把委托封装到一个方法里调用呢?这样咱们就知道这个委托负责作什么的啦

public delegate void SayDelegate(string name); public class ChinesePeople { public void SayChinese(string name) { Console.WriteLine("你好" + name); } } public class EnglishPeople { public void SayEnglish(string name) { Console.WriteLine("hello" + name); } }  public class GreetEvent  { public void Greet(string name, SayDelegate2 action) { action(name); } } class Program { static void Main(string[] args) { string name = "a"; ChinesePeople cp = new ChinesePeople(); EnglishPeople ep = new EnglishPeople(); 
            GreetEvent gEvent= new GreetEvent(); SayDelegate delegate1 = cp.SayChinese; delegate1 += ep.SayEnglish;
       //这样咱们就知道这是在“Greet”问好 gEvent.Greet(name, delegate1); Console.ReadLine(); } }

写完咱们发现,wow居然须要这么多声明?这彻底不符合咱们面向对象封装性的原则呀!咱们能不能把委托、事件写到一块儿呢?

因而事件(Event)出来了。

 

 

事件实例:

模拟情景:主人来了,主人问好以后,两个客人——一个中国人一个英国人也向主人问好。

(这就是经典的发布订阅模式,发布者是主人,订阅者是中国人和英国人。发布者作出的行动以后,订阅者也作出相应的行为)

因此咱们新建一个主人类,封装委托,事件,和触发事件的函数。

  public class Master { public delegate void SayDelegate(string name); public event SayDelegate SayEvent; public void Greet(string name) { if (SayEvent != null) { SayEvent(name); } } } public class ChinesePeople { public void SayChinese(string name) { Console.WriteLine("你好" + name); } } public class EnglishPeople { public void SayEnglish(string name) { Console.WriteLine("hello" + name); } } class Program { static void Main(string[] args) { string name = "张三"; ChinesePeople cp = new ChinesePeople(); EnglishPeople ep = new EnglishPeople(); Master m = new Master(); m.SayEvent += cp.SayChinese; m.SayEvent += ep.SayEnglish; m.SayEvent -= ep.SayEnglish; m.Greet(name); Console.ReadLine(); }  }

 

注意点:1. 事件不能像委托直接delegate(name)调用,也就是说m.SayEvent()是不可行的。只能经过调用函数去触发事件

    2.事件不能直接赋值,只能经过+=和-=增长和移除函数

 

忽然写这个文章是由于工做中遇到的须要传函数名进行封装的方法~记录一下,也但愿能给初学者带来帮助。

相关文章
相关标签/搜索