多播委托
程序员文章站
2023-08-25 14:45:07
所有的委托实例都有多播的功能。所谓多播,就像一群程序员在瞬聘网填好了求职意向后,某天有个公司发布了一个和这些程序员求职意向刚好相匹配的工作,然后这些求职者都被通知了 - “有一份好工作招人啦,你们可以直接申请去上班了!”。 也就是说,一个委托实例不仅可以指向一个方法,还可以指向多个方法。例如: My ......
所有的委托实例都有多播的功能。所谓多播,就像一群程序员在瞬聘网填好了求职意向后,某天有个公司发布了一个和这些程序员求职意向刚好相匹配的工作,然后这些求职者都被通知了 - “有一份好工作招人啦,你们可以直接申请去上班了!”。
也就是说,一个委托实例不仅可以指向一个方法,还可以指向多个方法。例如:
mydelegate d = mymethod1;// “+=” 用来添加,同理“-=”用来移除。 d += mymethod2;// d -= mymethod2
调用时,按照方法被添加的顺序依次执行。注意,对于委托,+= 和 -= 对null是不会报错的,如:
mydelegate d; d += mymethod1;// 相当于mydelegate d = mymethod1;
为了更好的理解多播在实际开发中的应用,我用模拟瞬聘网的职位匹配小工具来做示例。在职位匹配过程中会有一段处理时间,所以在执行匹配的时候要能看到执行的进度,而且还要把执行的进度和执行情况写到日志文件中。在处理完一个步骤时,将分别执行两个方法来显示和记录执行进度。
我们先定义一个委托(progressreporter),然后定义一个匹配方法(match)来执行该委托中的所有方法。如下:
public delegate void progressreporter(int percentcomplete); public class utility { public static void match(progressreporter p) { if (p != null) { for (int i = 0; i <= 10; i++) { p(i * 10); system.threading.thread.sleep(100); } } } }
然后我们需要两个监视进度的方法,一个把进度写到console,另一个把进度写到文件。如下:
class program { static void main(string[] args) { progressreporter p = writeprogresstoconsole; p += writeprogresstofile; utility.match(p); console.writeline("done."); console.readkey(); } static void writeprogresstoconsole(int percentcomplete) { console.writeline(percentcomplete+"%"); } static void writeprogresstofile(int percentcomplete) { system.io.file.appendalltext("progress.txt", percentcomplete + "%"); } }
运行结果:
看到这里,是不是发现你已然更加爱上c#了。
下一篇: 汤圆要煮多久?教你怎么煮汤圆!
推荐阅读