网上其实看了挺多关于委托的解释和教程代码说明的,看的迷迷糊糊,最后觉得没有遇到,最后还是没去认真看,但是近期有问题,写了写委托,然后会了,其实也还是基础。
链接1 链接2
在上面的链接中,张子阳(老师)的(第三条)可以看到委托的基本使用,但是其实对我来说,还是会有疑惑,这和直接调方法有啥区别,只是省了之前上面的if或者是switch判断罢了,因为都是在同一个界面(命名空间)里面写的,所以让人不是很好的理解(比如我),在这里,我的确还是没有理解,委托和调方法有啥区别。在链接2中我似乎理解了,后面的热水器的例子
举例
我看了很多文章,主要是,直接就告诉你委托应该怎么用,所以让我看的一脸懵(就是会写但是不知道怎么用),也有些恰好他们的举例和我自身遇到的问题不一致,所以收效甚微,我就举例我自己遇到的例子吧
假如A类提供数据,BCDEFG类接收数据,我遇到的情况是,B类(其他类都是这样)接收数据之后进行跳转(比如打开C类,也或者不跳转),然后C类再接收数据,其他类都不接收数据。
我因为使用的是winform,就用这个举例
个人开始思路
之前我的做法就是,BC…G类各自编号,如果出现有界面需要跳转,就返回需要跳转的编号,A类拿到编号就control.add 这个类,然后通过编号进switch,只调C类(假设后面需要接收的是C类)的对象方法给它传值,如果要跳转D类也是一样,如果有32个类(界面)需要来回跳转,那就要写32个case,其实看着还好?233333
这对我来说就是典型的思路,后面同事说,你这样不行,效率太低,不好维护以及调试bug找问题,于是就优化了一版,B类进行C类的初始化,以及C类的展示,首先是A类的数据静态化,static,然后每个类给个Timer,去监测A类的数据,当B类要跳转C类的时候,B类停掉自己的Timer,C类在构造方法(所有的类都是这样)里面写Timer启动方法,要跳转了就关掉自身的计时器,new 其他的类。
这个定时器是不是看着还行?就是timer用的有点多,用的多的话其实是容易卡顿的
委托
结合我之前的例子,A类一直是提供数据,那就是发布者,其他的类接收数据,那就是订阅者
A类中声明委托,然后实例化,再通过委托发布数据:
//定义委托
public delegate void DeGate_BtPageToggle(string clickkey);
//使用委托
public static DeGate_BtPageToggle DeGate_BtPageToge;
//发布数据
if (DeGate_BtPageToge!=null)
{
DeGate_BtPageToge("laF" + clickkey.ToString());
}
其他类接收数据就行,如果需要跳转了就减掉自身,添加上要跳转类的委托
public void PageToggle(string btname)
{
if (btname=="laF1")
{
DianReBL bl = new DianReBL();
MainForm.FooterPa.Controls.Clear();
MainForm.FooterPa.Controls.Add(bl);
MainForm.DeGate_BtPageToge -= this.PageToggle;
MainForm.DeGate_BtPageToge += bl.PageToggle;
}
//做其他事
}
委托其实我自己用下来其实感觉和用的timer差不多(形式上),要跳转了就关闭(-=),但是吧,并不是所有的C#平台都是有timer的吧,而且,背后的代码逻辑也不一样,我就,只会用🌚