了解 C# 中的事件和事件处理程序

2024-01-11

我了解事件的目的,尤其是在创建用户界面的背景下。我认为这是创建事件的原型:

public void EventName(object sender, EventArgs e);

事件处理程序有什么作用,为什么需要它们,以及如何创建一个事件处理程序?


要了解事件处理程序,您需要了解代表们 https://msdn.microsoft.com/en-us/library/ms173171.aspx. In C# http://en.wikipedia.org/wiki/C_Sharp_%28programming_language%29,您可以将委托视为方法的指针(或引用)。这很有用,因为指针可以作为值传递。

委托的核心概念是它的签名或形状。即 (1) 返回类型和 (2) 输入参数。例如,如果我们创建一个委托void MyDelegate(object sender, EventArgs e),它只能指向返回的方法void,并采取object and EventArgs。有点像方孔和方钉。所以我们说这些方法与委托具有相同的签名或形状。

因此,了解如何创建对方法的引用后,让我们考虑一下事件的目的:我们希望在系统其他地方发生某些事情时执行一些代码 - 或者“处理事件”。为此,我们为要执行的代码创建特定的方法。事件和要执行的方法之间的粘合剂是委托。事件必须在内部存储指向事件引发时要调用的方法的指针“列表”。*当然,为了能够调用方法,我们需要知道要传递给它的参数!我们使用委托作为事件和将调用的所有特定方法之间的“契约”。

所以默认的EventHandler(和许多人喜欢的)代表方法的具体形式(同样,void/object-EventArgs)。当你宣布一个事件时,你是在说哪种形式的方法(EventHandler) 该事件将通过指定委托来调用:

//This delegate can be used to point to methods
//which return void and take a string.
public delegate void MyEventHandler(string foo);

//This event can cause any method which conforms
//to MyEventHandler to be called.
public event MyEventHandler SomethingHappened;

//Here is some code I want to be executed
//when SomethingHappened fires.
void HandleSomethingHappened(string foo)
{
    //Do some stuff
}

//I am creating a delegate (pointer) to HandleSomethingHappened
//and adding it to SomethingHappened's list of "Event Handlers".
myObj.SomethingHappened += new MyEventHandler(HandleSomethingHappened);

//To raise the event within a method.
SomethingHappened("bar");

(*这是 .NET 中事件的关键,它揭开了“魔力”——事件实际上只是具有相同“形状”的方法列表。该列表存储在事件所在的位置。当事件被“引发”,它实际上只是“遍历这个方法列表并调用每个方法,使用这些值作为参数”。分配事件处理程序只是将方法添加到此方法列表的一种更漂亮、更简单的方法被称为)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 C# 中的事件和事件处理程序 的相关文章

随机推荐

  • 如何在CSS中从上到下堆叠div

    我有一个这样的列表 div class item 1 div div class item 2 div div class item 3 div div class item 4 div div class item 5 div 使用 cs
  • HttpClient 返回特殊字符但没有可读内容

    我正在尝试使用 async await 和 HttpClient 下载网页 但只得到一个充满特殊字符的字符串 代码就像 static async void DownloadPageAsync string url HttpClient cl
  • Flutter - 跨多个设备的端到端加密的密钥存储

    我正在编写一个 flutter 应用程序 用户基本上可以在其中创建注释 我编写了代码来为用户创建私钥 稍后用于加密他们的数据 加密数据存储在 Firebase Firestore 中 当检索他们的数据时 将使用他们的密钥对其进行解密 我看过
  • TensorFlow:“模块”对象没有属性“SessionRunHook”

    我在 Ubuntu 16 04 上运行 TensorFlow r0 10 版本 我已经能够运行一些基本教程 包括 MIST 字符识别教程 我正在努力完成CIFAR 10 https www tensorflow org versions r
  • 在线和离线用户实时使用 strope.js

    我在用strope js用于连接的 javascript 客户端库xmpp server openfire 使用下面的代码 var BOSH SERVICE http 127 0 0 1 7070 http bind connection
  • 将表单另存为图像(屏幕截图)

    我有两种形式 表格 1 包含我需要截图的内容 表格 2 包含图形绘制 该表格始终位于顶部但透明 我需要对第一个表单进行屏幕截图 而不将其放在表单 2 之上 也不包含表单 2 中的内容 这是我正在处理的一些问题 我正在努力修复 Private
  • Android checkbox.isChecked() 无法正常工作

    我有一个ListView其中一个checkbox显示在每行中 每一次checkbox被触摸 我检查它是否被选中 但每次 第一项总是返回false 但是 如果选中第 2 项 则 ischecked 第一项的复选框的方法总是返回true 这是我
  • 捕获 Ruby on Rails 应用程序的屏幕截图 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 Rails 应用程序 我想在用户输入 URL 时捕获网页的屏幕截图 是否可以在 Rails
  • SVN + SASL + ActiveDirectory:如何

    我正在尝试设置 SVN 以针对 ActiveDirectory 进行身份验证 我知道如果您将 SVN 设置为使用 Apache 提供服务 这是可能的 但这样做会带来太多开销 并且 SVN 运行速度太慢 通过阅读 SVN 文档 听起来现在应该
  • Python / Excel 自动化 - 将 2 个单元格中的文本放入 1 个单元格中

    我正在使用 python 自动执行使用 Excel 工作表列表创建多个名称标签的过程 我的问题是 我需要获取 名称 列和 企业 列值并将它们放入新文档的单个单元格中 像这样 To this 现在我正在使用 openpyxl 虽然我设法转移其
  • 在到期日期前“x”天启动 Sharepoint 工作流程

    我想在 Sharepoint 列表上创建工作流程 它应该发送通知电子邮件 问题是我希望此工作流程基于到期日期 在到期日期前 30 天发送电子邮件 并且我不创建或更新任何新的列表项 我知道只有在更改 创建任何项目时才能创建工作流程 但我在网上
  • 如何使用 .NET 检索数码相机拍摄的照片的属性?

    最好在 VB Net 中 但 C 也可以 我如何访问数码相机添加到文件中的额外属性 例如Date Picture Taken Shutter Speed or Camera Model 我维护一个库 为从各种文件格式中提取图像元数据提供全面
  • 代码:Blocks Mingw 编译器错误:可变大小对象可能未初始化

    我正在使用 C 创建一个简单的终端幻想游戏 我似乎遇到了错误 错误 可变大小的对象 项目 可能未初始化 这是代码 string useItem int item string items item HP Potion Attack Poti
  • 在WPF中,调用datagrid.CancelEdit()后DataGridTextColumn的值不会回滚

    我有一个包含两个文本列的数据网格 允许用户修改默认值 1 单击按钮时 如果用户按 是 我将显示一条确认消息 数据网格文本列的值应使用新值保存 如果是 否 网格文本列的值应滚动 重置回默认值或以前的值 问题在于 当用户单击确认消息中的 否 按
  • 向 PostgreSQL 添加不区分大小写的排序规则

    默认情况下 PostgreSQL 没有不区分大小写的排序规则 它的文档描述了一种根据操作系统区域设置添加新排序规则的方法 例如 http www postgresql org docs 9 1 static sql createcollat
  • 拉取后无法加载项目:“预期为‘ENCODING’,但发现为‘utf-8’。”

    从 git 拉取项目 WPF 应用程序 后 我收到此错误 可能是什么原因造成的 在拉动它之前它工作得很好 其他人致力于该项目 我的 csproject 文件中似乎有一些未关闭的标签 但奇怪的是 却报了上面的错误
  • 转换为 .NET 4 后 ClickOnce 升级失败

    我们的应用程序是通过 ClickOnce 部署的 NET 3 5 我们刚刚升级到 NET 4 0 并适当更新了先决条件 对于首次使用的用户或通过安装 HTML 页面安装的用户来说 安装仍然可以正常工作 它将自动为他们安装 NET 4 框架
  • PHP 包含的 html 内容会影响我的 seo 吗?

    今天我购买了一个小型 CMS 系统 有了这个 CMS 我可以将静态站点转换为可编辑页面 我必须剪切我想要编辑的内容 然后将其粘贴到管理区域中 该脚本将生成包含此内容的新 html 我必须将此 html 包含到原始内容所在的位置 我需要一些关
  • 多个字典具有重复的键但不同的值并且列中没有限制

    这里的数据集在字典中具有无限的键 根据客户的不同 行中的详细信息列可能有不同的信息产品 ID Name Detail 1 Sara Personal ID 001 Name Sara Type 01 TypeName Book Order
  • 了解 C# 中的事件和事件处理程序

    我了解事件的目的 尤其是在创建用户界面的背景下 我认为这是创建事件的原型 public void EventName object sender EventArgs e 事件处理程序有什么作用 为什么需要它们 以及如何创建一个事件处理程序