一个简单的小例子让你明白c#中的委托-终于懂了!

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

模拟主持人发布一个问题,由多个嘉宾来回答这个问题。

分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类。

作为问题的发布者,Host不知道问题如何解答。因此它只能发布这个事件,将事件委托给多个嘉宾去处理。因此在Host 类定义事件,在Guests类中定义事件的响应方法。通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件。实现过程如下:

代码其实很少下面贴出来所有代码:

QuestionArgs.cs

view plaincopy to clipboardPRint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { public class QuestionArgs:EventArgs { public string Message { get; set; } } }

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { public class QuestionArgs:EventArgs { public string Message { get; set; } } }

Program.cs

view plaincopy to clipboardprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class Program { static void Main(string[] args) { Host host = new Host(); host.Name = "主持人"; host.args.Message = "C#的事件如何实现的?"; Guests[] gArray = new Guests[3] { new GuestA(){Name = "张小三"}, new GuestB(){Name = "李小四"}, new GuestC(){Name = "王老五"} }; //用+=号,将嘉宾的答题方法加入到委托链 host.QuestionEvent += new QuestionHandler(gArray[0].answer); host.QuestionEvent += new QuestionHandler(gArray[1].answer); host.QuestionEvent += new QuestionHandler(gArray[2].answer); //触发事件 host.StartAnswer(); Console.ReadLine(); } } }<span style="color:#ff0000;"> </span>

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class Program { static void Main(string[] args) { Host host = new Host(); host.Name = "主持人"; host.args.Message = "C#的事件如何实现的?"; Guests[] gArray = new Guests[3] { new GuestA(){Name = "张小三"}, new GuestB(){Name = "李小四"}, new GuestC(){Name = "王老五"} }; //用+=号,将嘉宾的答题方法加入到委托链 host.QuestionEvent += new QuestionHandler(gArray[0].answer); host.QuestionEvent += new QuestionHandler(gArray[1].answer); host.QuestionEvent += new QuestionHandler(gArray[2].answer); //触发事件 host.StartAnswer(); Console.ReadLine(); } } }<span style="color:#ff0000;"> </span>

Host.cs

view plaincopy to clipboardprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { public delegate void QuestionHandler(object sender,QuestionArgs e); public class Host { //定义一个事件 public event QuestionHandler QuestionEvent; public QuestionArgs args { set; get; } public Host() { //初始化事件参数 args = new QuestionArgs(); } public string Name { get; set; } public void StartAnswer() { Console.WriteLine("开始答题"); QuestionEvent(this, args); } } }

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { public delegate void QuestionHandler(object sender,QuestionArgs e); public class Host { //定义一个事件 public event QuestionHandler QuestionEvent; public QuestionArgs args { set; get; } public Host() { //初始化事件参数 args = new QuestionArgs(); } public string Name { get; set; } public void StartAnswer() { Console.WriteLine("开始答题"); QuestionEvent(this, args); } } }

Guests.cs

view plaincopy to clipboardprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { /// <summary> /// 父类 /// </summary> public class Guests { /// <summary> /// 嘉宾姓名 /// </summary> public string Name { get; set; } public virtual void answer(object sender, QuestionArgs e) { Console.Write("事件的发出者:" + (sender as Host).Name); Console.WriteLine("问题是:" + e.Message); } } }

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { /// <summary> /// 父类 /// </summary> public class Guests { /// <summary> /// 嘉宾姓名 /// </summary> public string Name { get; set; } public virtual void answer(object sender, QuestionArgs e) { Console.Write("事件的发出者:" + (sender as Host).Name); Console.WriteLine("问题是:" + e.Message); } } }

GuestC.cs

view plaincopy to clipboardprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class GuestC:Guests { public override void answer(object sender, QuestionArgs e) { base.answer(sender, e); Console.WriteLine("{0}开始答题:我不知道", this.Name); } } }

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class GuestC:Guests { public override void answer(object sender, QuestionArgs e) { base.answer(sender, e); Console.WriteLine("{0}开始答题:我不知道", this.Name); } } }

GuestB.cs

view plaincopy to clipboardprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class GuestB:Guests { public override void answer(object sender, QuestionArgs e) { base.answer(sender, e); Console.WriteLine("{0}开始答题:我不知道", this.Name); } } }

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class GuestB:Guests { public override void answer(object sender, QuestionArgs e) { base.answer(sender, e); Console.WriteLine("{0}开始答题:我不知道", this.Name); } } }

GuestA.cs

view plaincopy to clipboardprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class GuestA:Guests { public override void answer(object sender, QuestionArgs e) { base.answer(sender, e); Console.WriteLine("{0}开始答题:我不知道", this.Name); } } }

[csharp] view plaincopyprint?

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace EventDemo { class GuestA:Guests { public override void answer(object sender, QuestionArgs e) { base.answer(sender, e); Console.WriteLine("{0}开始答题:我不知道", this.Name); } } }

运行结果:

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航