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

做网站要什么颜色模式软件仓库

做网站要什么颜色模式,软件仓库,宜昌商城网站建设,wordpress drupal joomla目录 本文较长#xff0c;给大家提供了目录#xff0c;可以直接看自己感兴趣的部分。 前言有关事件的概念示例​ 简单示例​ 标准 .NET 事件模式​ 使用泛型版本的标准 .NET 事件模式​ 补充总结 参考前言 前面介绍了C#中的委托#xff0c;事件的很多部分都与委托…目录 本文较长给大家提供了目录可以直接看自己感兴趣的部分。 前言有关事件的概念示例​ 简单示例​ 标准 .NET 事件模式​ 使用泛型版本的标准 .NET 事件模式​ 补充总结 参考前言 前面介绍了C#中的委托事件的很多部分都与委托类似。实际上事件就像是专门用于某种特殊用途的简单委托事件包含了一个私有的委托如下图所示 有关事件的私有委托需要了解的重要事项如下 1、事件提供了对它的私有控制委托的结构化访问。我们无法直接访问该委托。 2、事件中可用的操作比委托要少对于事件我们只可以添加、删除或调用事件处理程序。 3、事件被触发时它调用委托来依次调用调用列表中的方法。 有关事件的概念 发布者Publisher发布某个事件的类或结构其他类可以在该事件发生时得到通知。 订阅者Subscriber注册并在事件发生时得到通知的类或结构。 事件处理程序event handler由订阅者注册到事件的方法在发布者触发事件时执行。 触发raise事件调用invoke或触发fire事件的术语。当事件触发时所有注册到它的方法都会被依次调用。 示例 简单示例 现在我们先来看一下最最原始的事件示例。其结构如下所示 委托类型声明事件和事件处理程序必须有共同的签名和返回类型它们通过委托类型进行描述。 事件处理程序声明订阅者类中会在事件触发时执行的方法声明。它们不一定有显示命名的方法还可以是匿名方法或Lambda表达式。 事件声明发布者类必须声明一个订阅者类可以注册的事件成员。当声明的事件为public时称为发布了事件。 事件注册订阅者必须订阅事件才能在它被触发时得到通知。 触发事件的代码发布者类中”触发“事件并导致调用注册的所有事件处理程序的代码。 现在我们可以照着这个思路去写示例代码。 首先声明一个自定义的委托类型 public delegate void MyDelegate();该委托类型没有参数也没有返回值。 然后再写一个发布者类 public class Publisher{public event MyDelegate MyEvent;public void DoCount(){for(int i 0; i 10; i) { Task.Delay(3000).Wait(); //确认有方法可以执行if(MyEvent ! null){//触发事件MyEvent();}}}}事件声明 public event MyDelegate MyEvent;事件声明在一个类中它需要委托类型的名称任何注册到事件的处理程序都必须与委托类型的签名和返回类型匹配。它声明为public这样其他类和结构可以在它上面注册事件处理程序。不能使用对象创建表达式new表达式来创建它的对象。 一个常见的误解就是把事件认为是类型事件其实不是类型它和方法、属性一样是类或结构的成员。 由于事件是成员所以我们不能在一段可执行的代码中声明事件它必须声明在类或结构中和其他成员一样。 事件成员被隐式自动初始化为null。 事件声明的图解如下所示 触发事件 //确认有方法可以执行if(MyEvent ! null){//触发事件MyEvent();}也可以这样写 //确认有方法可以执行if(MyEvent ! null){//触发事件MyEvent().Invoke();}这两者是等效的MyEvent();直接调用事件的委托MyEvent().Invoke()使用显式调用委托的 Invoke 方法。 现在再看看订阅者类 public class Subscriber{ public void EventHandler(){Console.WriteLine(${DateTime.Now}执行了事件处理程序);}}订阅者类中有一个EventHandler方法与前面定义的委托类型的签名与返回值类型一致。 在看下主函数 static void Main(string[] args){Publisher publisher new Publisher();Subscriber subscriber new Subscriber();//订阅事件publisher.MyEvent subscriber.EventHandler;publisher.DoCount();}publisher.MyEvent subscriber.EventHandler;就是在订阅事件对应上面结构图中的事件注册将subscriber类的EventHandler方法注册到publisher类的MyEvent事件上。 也可以通过 publisher.MyEvent - subscriber.EventHandler;取消订阅事件。 运行结果如下所示 本示例全部代码如下所示 internal class Program{public delegate void MyDelegate();public class Publisher{public event MyDelegate MyEvent;public void DoCount(){for(int i 0; i 3; i) { Task.Delay(3000).Wait();//确认有方法可以执行if(MyEvent ! null){//触发事件MyEvent();}}}}public class Subscriber{ public void EventHandler(){Console.WriteLine(${DateTime.Now}执行了事件处理程序);}}static void Main(string[] args){Publisher publisher new Publisher();Subscriber subscriber new Subscriber();//订阅事件publisher.MyEvent subscriber.EventHandler;publisher.DoCount();}}以上就根据上面的结构图写出了一个使用事件的示例但是本示例还有需要改进的地方。 上面我们触发事件检查空值是这样写的 //确认有方法可以执行if(MyEvent ! null){//触发事件MyEvent();}C# 6.0 引入了空条件操作符之后现在也可以这样做空值检查 MyEvent?.Invoke();同时也不是一上来就检查空值而是先将MyEvent赋给第二个委托变量localDelegate MyDelegate localDelegate MyEvent;localDelegate?.Invoke();这个简单的修改可确保在检查空值和发送通知之间如果一个不同的线程移除了所有MyEvent订阅者将不会引发NullReferenceException异常。 标准 .NET 事件模式 以上我们以一个简单的例子介绍了C#中的事件但是大家可能会觉得有点模式跟我们平常在winform中使用的事件好像不太一样那是因为 .NET 框架提供了一个标准模式接下来我将以winform中的button按钮点击事件为例进行介绍。 页面很简单只有一个button按钮 然后button按钮点击事件的代码如下 private void button1_Click(object sender, EventArgs e){MessageBox.Show(Hello World);}现在我们再根据下面这张事件结构图来看一看标准的 .NET 事件模式 事件注册 打开解决方案中的Form1.Designer.cs文件 看到button1相关内容 button1.Click button1_Click;就是在订阅事件对应上面图中的事件注册。 委托类型声明 右键查看定义 public event EventHandler? Click{add Events.AddHandler(s_clickEvent, value);remove Events.RemoveHandler(s_clickEvent, value);}发现Click事件中的委托类型是EventHandler再查看EventHandler的定义 public delegate void EventHandler(object? sender, EventArgs e);这一步对应上面事件结构图中的委托类型声明。 EventHandler是 .NET中预定义的委托专门用来表示不生成数据的事件的事件处理程序方法应有的签名与返回类型。 第一个参数是sender用来保存触发事件的对象的引用。由于是object?类型所以可以匹配任何类型的实例。 第二个参数是e用于传递数据。但是EventArgs类表示包含事件数据的类的基类并提供用于不包含事件数据的事件的值。也就是说EventArgs设计为不能传递任何数据。它用于不需要传递数据的事件处理程序通常会被忽略。如果我们想要传递数据必须声明一个派生自EventArgs的类使用合适的字段来保存需要传递的数据。 尽管EventArgs类实际上并不传递数据但它是使用EventHandler委托模式的重要部分。不管参数使用的实际类型是什么object类和EventArgs类总是基类这样EventHandler就能提供一个对所有事件和事件处理器都通用的签名只允许两个参数而不是各自都有不同签名。 事件声明 public event EventHandler? Click{add Events.AddHandler(s_clickEvent, value);remove Events.RemoveHandler(s_clickEvent, value);}Click事件在Control类中定义Button类继承自ButtonBase类而ButtonBase类继承自Control类。 public event EventHandler? Click;对应上面结构图中的事件声明。 触发事件的代码 查看Button类的定义找到OnClick方法的定义 protected override void OnClick(EventArgs e){Form? form FindForm();if (form is not null){form.DialogResult _dialogResult;}// accessibility stuffAccessibilityNotifyClients(AccessibleEvents.StateChange, -1);AccessibilityNotifyClients(AccessibleEvents.NameChange, -1);// UIA events:if (IsAccessibilityObjectCreated){AccessibilityObject.RaiseAutomationPropertyChangedEvent(UiaCore.UIA.NamePropertyId, Name, Name);AccessibilityObject.RaiseAutomationEvent(UiaCore.UIA.AutomationPropertyChangedEventId);}base.OnClick(e);}去掉无关部分保留相关部分便于理解 protected override void OnClick(EventArgs e){base.OnClick(e); } 这里的base指的是Button类的基类ButtonBase类 再查看ButtonBase类中OnClick方法的定义: protected override void OnClick(EventArgs e){base.OnClick(e);OnRequestCommandExecute(e);}发现也有一个base.OnClick(e);这里的base指的是ButtonBase类的基类Control 再查看Control类中OnClick方法的定义: /// summary/// Raises the see crefClick//// event./// /summary[EditorBrowsable(EditorBrowsableState.Advanced)]protected virtual void OnClick(EventArgs e){((EventHandler?)Events[s_clickEvent])?.Invoke(this, e);}终于找到了触发事件的代码。 事件处理程序 这个想必大家并不陌生双击button按钮就可以看到 private void button1_Click(object sender, EventArgs e){MessageBox.Show(Hello World);}这对应上面结构图中的事件处理程序。该事件处理程序方法的签名与返回值类型与EventHandler委托类型一致。 使用泛型版本的标准 .NET事件模式 接下来我会举一个例子说明如何使用泛型版本的标准 .NET事件模式。 第一步自定义事件数据类该类继承自EventArgs类 public class MyEventArgs : EventArgs{public string? Message { get; set; }public DateTime? Date { get; set; }}拥有两个属性Message与Date。 第二步写发布者类 public class Publisher{public event EventHandlerMyEventArgs? SendMessageEvent;public void SendMessage(){for(int i 0; i 3; i){Task.Delay(3000).Wait();MyEventArgs e new MyEventArgs();e.Message $第{i1}次触发事件;e.Date DateTime.Now;EventHandlerMyEventArgs? localEventHandler SendMessageEvent;localEventHandler?.Invoke(this, e);}}}public event EventHandlerMyEventArgs? SendMessageEvent;声明了事件。 EventHandlerMyEventArgs? localEventHandler SendMessageEvent;localEventHandler?.Invoke(this, e);触发了事件。 第三步写订阅者类 public class Subscriber{public void EventHandler(object? sender,MyEventArgs e){Console.WriteLine($Received Message:{e.Message} at {e.Date});}}包含事件处理程序该方法与EventHandlerMyEventArgs委托类型的签名与返回值类型一致。 第四步写主函数 static void Main(string[] args){Publisher publisher new Publisher();Subscriber subscriber new Subscriber();publisher.SendMessageEvent subscriber.EventHandler;publisher.SendMessage();}publisher.SendMessageEvent subscriber.EventHandler;订阅事件。 运行结果如下所示 包含了我们自定义的事件数据。 补充 上面说自定义的事件数据类要继承自EventArgs类但其实在 .NET Core 的模式较为宽松。 在此版本中EventHandlerTEventArgs 定义不再要求 TEventArgs 必须是派生自 System.EventArgs 的类。 因此我在.NET 8 版本的示例中去掉继承自EventArgs类该示例依旧能正常运行。 异步事件订阅者 一个关于异步事件订阅者的例子如下 // 事件发布者 public class EventPublisher {// 定义异步事件public event Funcstring, Task? MyEvent;// 触发事件的方法public async Task RaiseEventAsync(string message){Funcstring, Task localEvent MyEvent;await localEvent?.Invoke(message);} }// 异步事件订阅者 public class AsyncEventSubscriber {// 处理事件的异步方法public async Task HandleEventAsync(string message){Console.WriteLine($Received event with message: {message});// 异步操作例如IO操作、网络请求等await Task.Delay(3000);Console.WriteLine(Event handling complete.);} }class Program {static async Task Main(string[] args){// 创建事件发布者var publisher new EventPublisher();// 创建异步事件订阅者var subscriber new AsyncEventSubscriber();// 订阅事件publisher.MyEvent subscriber.HandleEventAsync;// 触发事件await publisher.RaiseEventAsync(Hello, world!);Console.ReadLine();} }运行结果如下所示 总结 本文先是介绍了一些C#中事件的相关概念然后通过几个例子介绍了在C#中如何使用事件。 参考 1、《C#图解教程》 2、《C# 7.0 本质论》 3、[C# 文档 - 入门、教程、参考。 | Microsoft Learn](
http://www.pierceye.com/news/662129/

相关文章:

  • 遵义网站建设公司电话多少成都网站优化seo
  • 宝安网站设计排名网站建设收费标准资讯
  • 景安怎么把网站做别名西安网站优化seo
  • 长沙专业网站建设怎么做云南昆明百度推广公司
  • 网页制作网站的大作业网站开发怎么设置打印按钮
  • 金乡网站建设哪家便宜建网站解决方案
  • 大港油田建设官方网站怎么帮人做网站
  • nginx建设网站教程wordpress文章列表格子
  • 山东网站开发学校深圳福田网站建设公司
  • 做电商网站的框架结构图江西省住房和城乡建设厅
  • 运输网站建设网站上的销售怎么做的
  • ps做网站首页效果图潮安区住房和城乡建设局网站
  • 商业网站怎么做做图赚钱的网站
  • 如何建立微信网站工作室暴利项目
  • 购物网站建设模板下载家在深圳 歌曲
  • wordpress 网站搬迁网站改版提交给百度
  • 黄山网站建设免费咨询网页制作初学者
  • 小说网站模板温州建设集团有限公司网站
  • 医疗器械为什么做网站杭州网站制作培训
  • 村志网站建设品牌设计logo图片
  • 网站更新服务公司网页打不开显示404要怎么处理
  • 注册公司是在哪个网站网站建设案例步骤
  • 机械设备网站源码中国神鹰网站建设
  • access 网站源码安阳市地图
  • 临沂房产和房建设局网站双和关键词排名怎么查
  • 建网站多少费用301不同类型网站
  • 深圳seo网站排名优化贵州省都匀市网站建设
  • 个人网站风格设计做网站时需要注意什么问题
  • 时装网站建设的背景软装设计费用
  • 排名轻松seo 网站国内开源平台