当前位置: 首页 > news >正文

洛阳产品网络推广平台东莞市seo网络推广哪家好

洛阳产品网络推广平台,东莞市seo网络推广哪家好,wordpress关键词位置,前端线上培训哪个好目录 C# 事件#xff08;Event#xff09; 事件概述 如何订阅和取消订阅事件 以编程方式订阅事件 使用匿名函数订阅事件 取消订阅 如何发布符合 .NET 准则的事件 发布基于 EventHandler 模式的事件 如何在派生类中引发基类事件 如何实现接口事件 如何实现自定义事…目录 C# 事件Event 事件概述 如何订阅和取消订阅事件 以编程方式订阅事件 使用匿名函数订阅事件 取消订阅 如何发布符合 .NET 准则的事件 发布基于 EventHandler 模式的事件 如何在派生类中引发基类事件 如何实现接口事件 如何实现自定义事件访问器 示例 C# 事件Event 事件Event 基本上说是一个用户操作如按键、点击、鼠标移动等等或者是一些提示信息如系统生成的通知。应用程序需要在事件发生时响应事件。例如中断。 C# 中使用事件机制实现线程间的通信。 事件概述 事件是一种在软件开发中常用的机制用于实现对象间的通信和协作。一个事件有两个主要的参与者事件发布者和事件订阅者。 事件发布者是引发事件的对象或类它定义了一个事件以及触发该事件的条件。事件发布者通过调用事件来通知其他对象事件的发生。 事件订阅者是希望接收并处理事件的对象或类。订阅者需要将自己的方法注册到事件上以便在事件发生时被调用。这个方法被称为事件处理程序用于处理事件发生时的逻辑。 在.NET类库中事件通常基于EventHandler委托和EventArgs基类。EventHandler委托定义了事件处理程序方法的签名它接受两个参数事件发布者和包含事件数据的EventArgs对象。通过使用标准的EventHandler委托可以方便地在事件订阅者之间共享事件处理程序。 事件的使用可以带来很多好处。它可以将代码分离为更小、更可维护的部分并提供了一种松耦合的方式来实现对象间的通信。通过事件可以实现多个对象对同一个事件作出响应的情况从而提高了代码的灵活性和可扩展性。 总结起来事件是一种在软件开发中常用的机制用于实现对象间的通信和协作。通过事件事件发布者可以通知事件订阅者事件的发生并且订阅者可以对事件作出响应。事件基于委托和事件参数类可以提供更灵活、可维护和可扩展的代码结构。 如何订阅和取消订阅事件 以编程方式订阅事件 在C#中可以使用运算符以编程方式订阅事件。下面是一个简单的示例 using System;class Program {static void Main(string[] args){MyEventPublisher publisher new MyEventPublisher();MyEventHandler handler new MyEventHandler();// 订阅事件publisher.MyEvent handler.HandleMyEvent;// 触发事件publisher.TriggerMyEvent();Console.ReadLine();} }class MyEventPublisher {// 定义事件public event EventHandler MyEvent;// 触发事件public void TriggerMyEvent(){MyEvent?.Invoke(this, EventArgs.Empty);} }class MyEventHandler {// 处理事件public void HandleMyEvent(object sender, EventArgs e){Console.WriteLine(由我的事件处理程序处理的事件);} }在上面的示例中我们定义了一个名为MyEventPublisher的事件发布者类和一个名为MyEventHandler的事件处理程序类。事件发布者类包含一个名为MyEvent的事件它是基于标准的EventHandler委托定义的。事件处理程序类包含一个名为HandleMyEvent的方法用于处理事件。 在Main方法中我们创建了一个事件发布者实例和一个事件处理程序实例。然后我们使用运算符将事件处理程序注册到事件上。最后我们调用TriggerMyEvent方法触发事件并在事件处理程序中输出一条消息。 总之在C#中可以使用运算符以编程方式订阅事件。这使得我们能够动态地向事件添加处理程序并在不再需要处理程序时将其从事件中删除。 使用匿名函数订阅事件 当需要快速订阅事件且事件处理逻辑相对简单时使用匿名函数订阅事件是一种方便的方式。下面是一个示例演示了如何在C#中使用匿名函数订阅事件 using System;class Program {static void Main(string[] args){MyEventPublisher publisher new MyEventPublisher();// 使用匿名函数订阅事件publisher.RaiseCustomEvent (sender, e) {Console.WriteLine(正在处理带有消息的自定义事件 e.Message);};// 触发事件publisher.TriggerCustomEvent();Console.ReadLine();} }class MyEventPublisher {// 定义事件public event EventHandlerCustomEventArgs RaiseCustomEvent;// 触发事件public void TriggerCustomEvent(){OnRaiseCustomEvent(new CustomEventArgs(事件已触发));}protected virtual void OnRaiseCustomEvent(CustomEventArgs e){RaiseCustomEvent?.Invoke(this, e);} }// 自定义事件参数类 public class CustomEventArgs : EventArgs {public string Message { get; }public CustomEventArgs(string message){Message message;} }在上面的示例中我们使用匿名函数来订阅RaiseCustomEvent事件。匿名函数直接定义在订阅操作中用于处理事件的触发。这样可以避免显式地定义命名的事件处理程序方法特别适用于只需要进行简单处理的情况。 注意如果使用匿名函数订阅事件事件的取消订阅过程将比较麻烦。 这种情况下若要取消订阅请返回到该事件的订阅代码将该匿名函数存储在委托变量中然后将此委托添加到该事件中。 如果必须在后面的代码中取消订阅某个事件则建议不要使用匿名函数订阅此事件。 有关匿名函数的详细信息请参阅 Lambda 表达式。 通过匿名函数订阅事件可以更加简洁地表示事件订阅和处理逻辑提高代码的可读性和简洁性。 取消订阅 若要防止在引发事件时调用事件处理程序请取消订阅该事件。 为了防止资源泄露应在释放订户对象之前取消订阅事件。 在取消订阅事件之前在发布对象中作为该事件的基础的多播委托会引用封装了订户的事件处理程序的委托。 只要发布对象保持该引用垃圾回收功能就不会删除订户对象。 在C#中取消订阅事件可以通过使用减法赋值运算符-来实现。 下面是一个示例演示了如何取消订阅之前示例中的事件 using System;class Program {static void Main(string[] args){MyEventPublisher publisher new MyEventPublisher();// 定义匿名函数作为事件处理程序EventHandlerCustomEventArgs eventHandler (sender, e) {Console.WriteLine(正在处理带有消息的自定义事件 e.Message);};// 订阅事件publisher.RaiseCustomEvent eventHandler;// 触发事件publisher.TriggerCustomEvent();// 取消订阅事件publisher.RaiseCustomEvent - eventHandler;// 再次触发事件publisher.TriggerCustomEvent();Console.ReadLine();} }class MyEventPublisher {// 定义事件public event EventHandlerCustomEventArgs RaiseCustomEvent;// 触发事件public void TriggerCustomEvent(){OnRaiseCustomEvent(new CustomEventArgs(事件已触发));}protected virtual void OnRaiseCustomEvent(CustomEventArgs e){RaiseCustomEvent?.Invoke(this, e);} }// 自定义事件参数类 public class CustomEventArgs : EventArgs {public string Message { get; }public CustomEventArgs(string message){Message message;} }在上面的示例中我们首先定义了一个匿名函数作为事件处理程序并将其保存在一个变量eventHandler中。然后我们使用运算符订阅了RaiseCustomEvent事件并在事件触发后又使用-运算符取消了对事件的订阅。这样就实现了事件的订阅和取消订阅操作。 通过使用-运算符取消订阅事件可以避免事件处理程序继续接收事件通知从而实现了对事件的动态管理。 注意所有订户都取消订阅事件后发行者类中的事件实例将设置为 null。 如何发布符合 .NET 准则的事件 发布基于 EventHandler 模式的事件 发布事件是一种常见的设计模式它允许一个对象通知其他对象发生了某些事情。在 C# 中可以使用 EventHandler 模式来实现事件发布。 基于 EventHandler 模式的事件发布包括以下步骤 定义自定义事件参数类通常情况下事件需要携带一些数据。可以通过自定义事件参数类来实现这个功能。自定义事件参数类必须继承自 EventArgs 类并且应该包含至少一个属性以保存事件数据。 声明委托类型在发布类中声明一个委托类型用于定义事件处理程序的签名。对于非泛型版本的  EventHandler 委托无需声明因为它已经在 System 命名空间中定义。对于泛型版本的 EventHandlerTEventArgs 委托则不需要自定义委托类型而是将事件类型指定为  EventHandler CustomEventArgs其中 CustomEventArgs 是第一步中定义的自定义事件参数类。 声明事件类型在发布类中声明一个事件类型使用步骤 2 中定义的委托类型作为事件处理程序的类型。如果使用泛型版本的 EventHandlerTEventArgs委托则可以直接使用  EventHandler CustomEventArgs 类型来声明事件。 引发事件在发布类中编写一个受保护的虚方法用于执行实际的事件引发操作。在这个方法中通过调用事件类型的 Invoke 方法来触发事件并将自定义事件参数对象传递给事件处理程序。 订阅事件在订阅方代码中使用 运算符订阅事件。订阅方可以是类、结构体、接口或委托类型。当事件引发时所有订阅了该事件的订阅方都会接收到通知并执行相应的事件处理程序。 下面是一个基于 EventHandler 模式的事件发布的示例代码 // 定义自定义事件参数类 public class CustomEventArgs : EventArgs {public string Message { get; private set; }public CustomEventArgs(string message){Message message;} }// 声明委托类型 public delegate void CustomEventHandler(object sender, CustomEventArgs e);// 发布类 public class MyEventPublisher {// 声明事件类型public event CustomEventHandler RaiseCustomEvent;// 引发事件protected virtual void OnRaiseCustomEvent(CustomEventArgs e){RaiseCustomEvent?.Invoke(this, e);}// 触发事件的方法public void TriggerCustomEvent(){OnRaiseCustomEvent(new CustomEventArgs(Hello, World!));} }// 订阅方代码 class Program {static void Main(string[] args){MyEventPublisher publisher new MyEventPublisher();// 订阅事件publisher.RaiseCustomEvent Publisher_RaiseCustomEvent;// 触发事件publisher.TriggerCustomEvent();Console.ReadLine();}// 事件处理程序private static void Publisher_RaiseCustomEvent(object sender, CustomEventArgs e){Console.WriteLine(e.Message);} }在上面的示例中我们首先定义了一个自定义事件参数类 CustomEventArgs它包含一个 Message 属性来保存事件数据。然后我们声明了一个名为 CustomEventHandler 的委托类型并用作 MyEventPublisher 类中 RaiseCustomEvent 事件的处理程序类型。在 MyEventPublisher 类中我们使用 OnRaiseCustomEvent 方法来引发 RaiseCustomEvent 事件然后在 TriggerCustomEvent 方法中调用该方法。 在 Main 方法中我们创建 MyEventPublisher 实例 publisher并使用 运算符订阅 RaiseCustomEvent 事件。之后我们调用 publisher 的 TriggerCustomEvent 方法来触发事件。当 RaiseCustomEvent 事件被触发时我们定义的事件处理程序 Publisher_RaiseCustomEvent 将被调用并输出 Hello, World! 字符串到控制台。 如何在派生类中引发基类事件 在派生类中引发基类事件的过程与在基类中引发事件的过程类似只需要通过基类的事件来触发即可。下面是在派生类中引发基类事件的基本步骤 在派生类中声明一个新的事件或者可以选择重用基类的事件。创建一个方法来触发基类事件。 下面是一个示例代码演示了如何在派生类中引发基类事件 using System;// 基类 public class BaseClass {// 声明基类事件类型public event EventHandler BaseEventRaised;// 引发基类事件的方法protected virtual void OnBaseEventRaised(EventArgs e){BaseEventRaised?.Invoke(this, e);} }// 派生类 public class DerivedClass : BaseClass {public void DoSomething(){// 在派生类中进行一些操作// 触发基类事件OnBaseEventRaised(EventArgs.Empty);} }// 主程序 class Program {static void Main(string[] args){DerivedClass derived new DerivedClass();// 订阅基类事件derived.BaseEventRaised BaseEvent_Handler;// 在派生类中触发事件derived.DoSomething();Console.ReadLine();}// 基类事件处理程序private static void BaseEvent_Handler(object sender, EventArgs e){Console.WriteLine(在派生类中处理的基事件。);} }在上面的示例中我们首先定义了一个基类 BaseClass它包含一个名为 BaseEventRaised 的事件以及相应的触发方法 OnBaseEventRaised。然后我们创建了一个派生类 DerivedClass在该类中我们调用了基类事件触发方法 OnBaseEventRaised 来触发基类事件。 在主程序中我们创建了 DerivedClass 的实例 derived并订阅了基类的事件 BaseEventRaised。之后我们调用 derived 的 DoSomething 方法来触发事件。当基类事件被触发时我们定义的事件处理程序 BaseEvent_Handler 将被调用并输出 在派生类中处理的基事件。 到控制台。 通过这种方式派生类可以很容易地引发基类中已定义的事件从而实现事件传播和处理。 如何实现接口事件 在 C# 中接口可以定义事件需要使用 event关键字来标记接口中的事件。实现接口事件的类必须提供事件的实现。下面是实现接口事件的基本步骤 定义一个包含事件的接口并使用 event 关键字来标记事件。 实现接口的类必须提供事件的实现。为此可以在实现类中声明一个事件并将其与接口中的事件关联起来。 在实现类中引发事件的方法。 下面是一个示例代码演示了如何实现接口事件 using System;// 定义包含事件的接口 public interface IMyInterface {event EventHandler MyEventRaised; }// 实现接口的类 public class MyClass : IMyInterface {// 声明事件public event EventHandler MyEventRaised;// 引发事件的方法public void RaiseEvent(){OnMyEventRaised(EventArgs.Empty);}// 触发事件的方法protected virtual void OnMyEventRaised(EventArgs e){MyEventRaised?.Invoke(this, e);} }// 主程序 class Program {static void Main(string[] args){MyClass myClass new MyClass();// 订阅事件myClass.MyEventRaised MyEventHandler;// 触发事件myClass.RaiseEvent();Console.ReadLine();}// 事件处理程序private static void MyEventHandler(object sender, EventArgs e){Console.WriteLine(我的事件处理好了。);} }在上面的示例中我们首先定义了一个包含事件的接口 IMyInterface并使用 event 关键字来标记事件。然后我们创建了一个实现接口的类 MyClass在该类中声明了一个名为 MyEventRaised 的事件。在 MyClass 中我们使用 OnMyEventRaised 方法来触发 MyEventRaised 事件。 在主程序中我们创建了 MyClass 的实例 myClass并订阅了 MyEventRaised 事件。之后我们调用 myClass 的 RaiseEvent 方法来触发事件。当 MyEventRaised 事件被触发时我们定义的事件处理程序 MyEventHandler 将被调用并输出 我的事件处理好了。 到控制台。 通过这种方式我们可以在接口中定义事件并在实现类中提供事件的实现。因此可以轻松地将事件的行为分离到不同的类和接口中。 如何实现自定义事件访问器 事件是一种特殊的多播委托只能从声明它的类中进行调用。 客户端代码通过提供对应在引发事件时调用的方法的引用来订阅事件。 这些方法通过事件访问器添加到委托的调用列表中事件访问器类似于属性访问器不同之处在于事件访问器命名为 add 和 remove。 在大多数情况下无需提供自定义事件访问器。 如果代码中没有提供自定义事件访问器编译器将自动添加它们。 但在某些情况下可能需要提供自定义行为。 示例 下面的示例演示如何实现自定义的 add 和 remove 事件访问器来控制事件处理程序的添加和移除行为。 using System;public delegate void MyEventHandler(object sender, EventArgs e);public class MyClass {private event MyEventHandler myEvent;public event MyEventHandler MyEvent{add{Console.WriteLine(添加事件处理程序);myEvent value;}remove{Console.WriteLine(正在删除事件处理程序);myEvent - value;}}public void DoSomething(){Console.WriteLine(正在做某事。。。);myEvent?.Invoke(this, EventArgs.Empty);} }public class Program {static void Main(string[] args){MyClass myObj new MyClass();myObj.MyEvent MyEventHandler1;myObj.MyEvent MyEventHandler2;myObj.DoSomething();myObj.MyEvent - MyEventHandler2;myObj.DoSomething();Console.ReadLine();}private static void MyEventHandler1(object sender, EventArgs e){Console.WriteLine(事件处理程序处理的事件1);}private static void MyEventHandler2(object sender, EventArgs e){Console.WriteLine(事件处理程序处理的事件2);} }在上面的示例中我们首先声明了一个自定义委托MyEventHandler它定义了事件处理程序的签名。 然后我们在MyClass类中声明了一个私有的MyEventHandler类型的事件myEvent。接下来在MyEvent属性中定义了自定义的事件访问器。 在add访问器中我们输出添加事件处理程序的消息并将事件处理程序添加到myEvent事件中。在remove访问器中我们输出移除事件处理程序的消息并将其从myEvent事件中移除。 通过自定义事件访问器我们可以在添加和移除事件处理程序时执行自定义的逻辑。在上面的示例中我们简单地输出一条消息但你可以根据需要在这些访问器中添加更复杂的逻辑。 最后在主程序中我们创建了一个MyClass的实例myObj并订阅了MyEvent事件。在调用myObj.DoSomething()时事件处理程序被调用并输出相应的消息。然后我们使用-操作符将一个事件处理程序从事件中移除并再次调用myObj.DoSomething()只有一个事件处理程序被调用。
http://www.lakalapos1.cn/news/32080/

相关文章:

  • 商城网站建设价格最优本站3天更换一次域名yw
  • 网站建设最好北京住总第一开发建设有限公司网站
  • 南京网站建设 雷wordpress文章图片格式
  • 手机建设网站的目的woocommerce做的网站
  • 数字资产交易网站开发公司如何做网站建设
  • 传奇世界手游官网网站设计网络推广优化
  • 创办一个网站要多少钱宠物网站设计案例
  • 深圳商城网站设计推荐推广普通话宣传语
  • 网站建设各语言优点前端开发一般用什么软件
  • 常德营销型网站建设小说下载网站哪个好
  • 什么语言做网站好网页设计公司哪家效果好
  • 网站做友链的好处好优化网站设计
  • 注册网站会员会泄露信息吗svg wordpress
  • 如何做正规的采集网站如何做网站关键词
  • 如何创建个人网站英语作文有哪些炫酷的官方网站
  • 网站排名突然没有了网站营销方案模板
  • 为什么没有人做像58一样的网站学编程的培训机构
  • 网站动态模板济南优化专业的公司
  • 怎么利用自媒体做网站优化网站设计深圳公司
  • 沙坪坝做网站网站建设公司固定ip
  • 企业官网快速建站框架网站优化怎么做关键词排名
  • 怎么自己做优惠券网站公司申请域名
  • 网站建设升级的必要性短链接生成站长工具
  • 长沙做网站费用湖北省建设人力资源网站首页
  • Dell网站建设建议dw怎么做网站
  • 网站目录结构构建的原则是以广州网站建设外包建设推广
  • 企业网站管理系统教程建设网站用外包模板可以上线吗
  • 北京网站建设华网天下科技公司销售类网站模板
  • 琪恋网站建设怎么免费自己做网站
  • 网站开发liucheng绍兴集团网站建设