C#委托与事件的学习
以前做的东西没用到过委托事件(web开发),没发现具体有什么用。昨天老师讲委托事件那叫一个水啊,基本上就是说了语法就算了,回来自己找了文章学习了一下,主要就是张子阳的…(张子阳的委托事件文章)。确实对委托事件有了一定的理解,自己写个小程序练习下。
首先模拟WinForm中按钮点击事件,当然我不知道WinForm中是怎么实现按钮的点击事件的,首先实现处理窗体上按钮事件的类,根据点击的不同类型选择不同类型的方法处理:
class Click
{
public void ChoiceFunction(string clickWay)
{
switch (clickWay)
{
case "单击":
OnlyClick oc = new OnlyClick();
oc.OnlyClicked(clickWay);
break;
case "双击":
DoubleClick dc = new DoubleClick();
dc.DoubleClicked(clickWay);
break;
}
}
}
接着是单击事件的处理类:
//处理单击
class OnlyClick
{
public void OnlyClicked(string clickWay)
{
Console.WriteLine("您的操作时{0}", clickWay);
}
}
双击事件类似,略......。
接着在客户端也就是Main()中做我们的操作
class Program
{
static void Main(string[] args)
{
Click cl = new Click();
Console.WriteLine("**********单击按钮**********");
cl.ChoiceFunction("单击");
Console.WriteLine("**********单击按钮**********");
cl.ChoiceFunction("双击");
}
}
当然会输出如我们预料的结果。
可以看到程序的可扩展性事相当差的,如果我们想给按钮添加别是事件怎么办,继续写新的类,加更长的switch进行选择,此时委托的好处就出来了,我们可以把方法当参数传递给点击处理类,你单击就传入单击的处理方法,双击就传入双击的处理方法,再有新的功能只要写新的类就行。委托类似于C里的函数指针,把可以把方法当参数传递,接着改造上面的程序。
首先声明委托:
public delegate void ClickDelegate(string clickWay);//定义委托
接着对Click类进行改造:
class Click
{
public void ChoiceFunction(string clickWay,ClickDelegate clickFunction)
{
clickFunction(clickWay);
}
}
剩下的就是在客户端给Click传递要处理点击事件的方法了:
class Program
{
static void Main(string[] args)
{
Click cl = new Click();
OnlyClick oc=new OnlyClick();
DoubleClick dc=new DoubleClick();
Console.WriteLine("*********单击*********");
cl.ChoiceFunction("单击", new ClickDelegate(oc.OnlyClicked));//把处理单击事件的方法传递给委托
Console.WriteLine("*********双击*********");
cl.ChoiceFunction("单击", new ClickDelegate(dc.DoubleClicked));//把处理双击事件的方法传递给委托
}
}
处理单击事件的类和处理双击事件的类不用动,运行依然是我们要的结果:
这里就可以看到委托的灵活性了,我们可以很方便的给程序添加新的功能,而不必担心要进行过大的改动。
但是看到我们定义的委托在整个命名空间下,范围这么大,不符合面向对象封装的思想,所以我想把它拿到Click类里面,不过如果把委托拿到了Clickl里面,在外面我们就没办法用了,也没办法给Click传递方法了。接着event就出现了,此时事件event就好像我们在类里定义的属性一样 ,供外部访问委托。接着我们继续改造程序,首先把委托拿到Click类里面,然后定义事件:
//点击的处理
class Click
{
public delegate void ClickDelegate(string clickWay);//定义委托
public event ClickDelegate ClickEvent;//定义事件
public void ChoiceFunction(string clickWay)
{
if (ClickEvent != null)
{
ClickEvent(clickWay);
}
}
}
其中的ChoiceFunction用于触发事件,然后在客户端,注册事件就好了。
class Program
{
static void Main(string[] args)
{
Click cl = new Click();
OnlyClick oc = new OnlyClick();
DoubleClick dc = new DoubleClick();
Console.WriteLine("*********单击*********");
cl.ClickEvent += oc.OnlyClicked;//注册单击事件
cl.ChoiceFunction("单击");
Console.WriteLine("*********双击*********");
cl.ClickEvent -= oc.OnlyClicked;//取消单击事件的注册
cl.ClickEvent += dc.DoubleClicked;//注册双击事件
cl.ChoiceFunction("双击");
}
}
输出结果依然如故。Click就充当了事件的发布者,而OnlyClick,DoubleClick就充当了事件的注册者。其中事件是否要发生的决定权在Click中,外面的只要注册了事件就好,当调用了触发事件的方法时cl.ChoiceFunction(),
就触发了事件,相应的事件处理方法就会得到执行。虽然在Click中把委托定义是public但在外面根本没法访问,在声明委托相关的事件后,会隐式的创建一个委托的实例,是私有的,所以这就对委托进行了封装。
当然委托事件根本没这么简单,自己的理解还不够....
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架