事件和委托






3.84/5 (71投票s)
事件和委托 - 真实世界的应用。
引言
C# 中最有趣的概念之一是事件驱动方法。虽然这是一种简单的技术,但本文旨在为初学者以及那些仍在努力理解事件驱动模型的人提供帮助。
委托(Delegates)
委托模型是一个将任务交给另一个进程来完成的过程。经理被分配了一项可以由其下属执行的工作。由于他知道下属的确切位置,因此他会重定向或委托工作。这里,经理是委托,他的下属是被包装在委托中的方法。
委托是 C# 中的特殊对象,它们是指向方法的指针。它是 C# 中一项有趣且令人惊叹的特性。它为方法签名提供了一个名称。它们作为派生自基类 System.Delegate
的类来实现。它不过是一种像类一样的类型。但是对于类,有两个不同的术语:“类”,表示更广泛的定义,以及“对象”,表示类的实例。不幸的是,对于委托,只有一个术语。也就是说,当你创建一个委托的实例时,你创建的也被称为“委托”。定义委托的语法如下:
delegate <return type> <delegate name>( <parameter list> );
这里需要注意的重要一点是委托和方法的签名。软件团队经理将领导一群在信息技术领域受过教育、能够开发和维护软件应用程序的人。因此,要包装的方法必须与委托的签名匹配,否则将导致编译错误。
多播委托
组织中的任何经理都会有一名或多名下属在他手下工作。当一项任务要完成时,主管不会单独致电每个下属。因为主管不知道所有下属的专业。主管会指示或将任务分配给经理,然后经理会将工作委托给他的下属。显然,任何数量的下属都可以在任何时候被添加到某个团队或从某个团队中移除。
当一个委托被包装了多个方法时,这被称为多播委托。如上所述,指向多个成员的经理是多播委托。如果调用多播委托,它将按顺序连续调用每个方法。它派生自 System.MulticastDelegate
,而 System.MulticastDelegate
又派生自 System.Delegate
。System.MulticastDelegate
包含额外的成员,允许将方法调用链接在一起形成一个列表。
事件
事件不过是状态的变化。假设一个软件项目已成功安装在客户处。后来,维护部门被客户通知进行一些增强。这是一个事件,它会触发相应的经理采取必要的行动,他通过将任务委托给下属来处理。这里,请注意两个关键方面,即事件和事件处理程序。客户对修改的要求是“事件”,而将要执行该要求的下属是“事件处理程序”。
事件实际上是委托的一种特殊形式。它是服务器应用程序向该类的客户端提供有关对象发生某些有趣事情的通知的一种方式。它广泛用于图形用户界面 (GUI)。事件是使用委托声明的。考虑到上述示例,事件是服务器应用程序允许客户端应用程序为其提供指向在事件发生时应调用的方法的委托的一种方式。当事件发生时,由其客户端应用程序提供的委托将被调用。声明事件的语法是:
event < delegate type name > < event name >;
这里的 event
是关键字,委托类型是你之前声明的委托,后面是事件名称。
库存管理模块
这是包含四个事件和任意数量事件处理程序的代码。该模块包含 4 个类,即 CInventory
、CInventoryManager
、CInventoryWatcher
和 CStockentry
。在深入研究模块之前,我想先介绍一下库存管理系统。在任何物品的库存控制系统中,我们都有库存水平、再订购水平、最低和最高水平。当库存超过最高水平时,应通知采购部门停止订购新商品。同样,当库存达到最低或再订购水平时,我们会发出采购订单,并应得到授权,以便购买新商品。这就是本代码所解释的内容。
CInventory
类是一个实体类,用于维护商品名称和库存值。
private string _sStockName;
private int _iStock;
public string StockName
{get{return _sStockName;} set{ _sStockName=value;}}
public int Stock
{get{return _iStock;}set{_iStock += value;}}
CInventoryManager
是事件发布者,它有四个事件:OnInventoryChange
、OnMaxLevel
、OnROLevel
和 OnMinLevel
。每当库存值发生变化时,都会触发 OnInventoryChange
。其他事件根据特定状态触发。如果库存值小于或等于 20,将触发 OnMinLevel
事件。如果库存值小于或等于 50,将触发 OnROLevel
事件。如果库存值大于或等于 100,将触发 OnMaxLevel
事件。
public delegate void InvDel(object source,CInventory inventory);
public event InvDel OnInventoryChange;
public event InvDel OnMaxLevel;
public event InvDel OnROLevel;
public event InvDel OnMinLevel;
CInventoryWatcher
类是事件订阅者,其中包含事件处理程序。在这里,您可以看到多播委托是如何定义和执行的。在这个类的构造函数中,您会发现通过实例化 CInventoryManager
类中的 InvDel
委托来订阅事件。当 OnROLevel
事件发生时,订阅它的两个事件处理程序将被触发。这意味着,每当库存值达到再订购水平时,我们就必须创建采购订单,并且采购订单应该得到授权。
inventoryManager.OnInventoryChange += new CInventoryManager.InvDel(OnChange);
inventoryManager.OnROLevel += new CInventoryManager.InvDel(CreatePO);
inventoryManager.OnMaxLevel += new CInventoryManager.InvDel(CreateMaxMsg);
inventoryManager.OnMinLevel += new CInventoryManager.InvDel(CreateMinMsg);
inventoryManager.OnROLevel += new CInventoryManager.InvDel(AuthPO);
运行示例应用程序
运行示例应用程序。在库存录入窗体中,输入商品名称和新的库存值。我已经为最低、最高和再订购水平编码了值。即,最低水平 = 20,最高水平 = 100,再订购水平 = 50。如果您愿意,可以在 StockLevels.cs 文件中更改这些值。请查看源代码以获得更多说明。整个任务可以在一个文件中完成,但为了理解事件生成器和事件处理程序,我将它们分开了。
我希望您在阅读本文后能提出宝贵的反馈意见。