- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我要了解事件和委托(delegate)。
我大致了解委托(delegate)的用法。关于委托(delegate),我唯一关心的是是否可以将委托(delegate)配置为与以任何方式与事件无关的函数一起工作...如果是,我如何编写委托(delegate)定义函数的逻辑? (我想这样的功能并没有多大意义,但知道它很好。)
至于事件……我很难理解。我认为事件是一个函数,当代码中发生某些事情时会执行该函数。但是,我不知道创建事件的过程。部分。
对于这个问题,我将使用 Gary Willoughby 的回答:https://stackoverflow.com/a/803528/1104766它是在一个问题上发布的,我试图从中理解整个主题。
我在上面的例子中没有得到的:MyObject.OnMaximum += new MyEventHandler(MaximumReached);
首先,如何创建一个委托(delegate)实例,并在它需要 2 个变量时只传递 1 个变量?一定有什么我遗漏的...
关于这一行的第二件事是 new ...()
实例被添加到驻留在 中的
是 OnMaximum
函数中MyObjectMyClass
的一个实例 - 如果可以完成这样的事情,OnMaximum
到底是什么? 它也从未真正定义过!
if(OnMaximum != null) {
OnMaximum(this, new MyEventArgs("You've entered " +
value.ToString() +
", but the maximum is " +
Maximum.ToString()));
}
至于这部分,OnMaximum
被调用,但它的逻辑从未在代码中的任何地方真正定义,那么结果会是什么?显然我猜它会是文本“你已经输入......”但我的问题是更具体,函数的值到底发生了什么/事件接收?
为了清楚起见,我用粗体标记了我所有的问题。
P.S,我知道这个问题一般已经发布了几次。
请注意,这个特定问题是指另一个成员写的答案,这里提出的问题是特定于这个例子的。这就是为什么在谷歌中无法真正找到此类答案的原因。
不过郑重声明,我在发帖前进行了搜索,并尝试理解,但我想示例是我理解某些内容的最佳方式,尤其是在我缺乏英语 CS 词汇知识的情况下。
最佳答案
我想你可能是语法糖过量了!
你看,一个事件就是一个委托(delegate)。实际上,老实说,它是一个可能是 null
的委托(delegate)集合。 .
举个例子:
public class Alarm
{
public delegate void AlarmEvent();
// my secret stuff
// raise it!
public void Ring()
{
if(OnAlert != null)
OnAlert();
}
public event AlarmEvent OnAlert;
}
event 关键字在这里为我们提供的是为该事件添加和删除监听器的能力...
Alarm a = new Alarm();
a.OnAlert += myevent;
a.OnAlert += myotherevent;
另一方面,委托(delegate)虽然像我们刚才描述的那样工作,但更类似于函数指针。想象一个抽象渲染器,我可以这样创建类:
public abstract class Renderer
{
protected abstract void RenderImpl();
}
这意味着,我必须从该渲染中派生。但是,如果该渲染器接受委托(delegate)怎么办?
public abstract class Renderer
{
public delegate void RenderDelegate();
public Renderer(RenderDelegate) { /* ... */ }
}
我们现在正在分离组合。
我在说什么?是好还是不好?在事件的情况下,我允许公众成为我类(class)的观察员。他们可以使用react。在第二种情况下,我定义了一个用户提供的委托(delegate)来执行一个小众功能,同时我保留了大部分控制权。
委托(delegate)和事件在很大程度上是一回事 - 但我们做出的设计选择决定了哪一个是合适的。
为了解决您的其他问题,您举了一个很好的事件与委托(delegate)的例子。如果我们要更改上面的警报类,以允许委托(delegate)返回 true
或 false
,然后会发生什么?
我们会让几个观察者返回 true,但谁是正确的以及我们如何检查它们?
然而,沿着单委托(delegate)路线...“渲染成功”或“渲染失败”。改变这个单一的委托(delegate)并不是什么大问题。我们可以预测地测试我们的渲染器是否完成了工作:
if(!delegate_->Invoke())
fallBackCode();
我们真的不能用事件来做到这一点。嗯,出乎意料。
更简单地说,当您想要广播某些内容并让其他人在收到该事件后做某事时,就会出现事件。炸弹爆炸了……跑,躲起来,调用国民 guard 队,关掉 toastr ,或者躲起来躲起来。
委托(delegate)允许您在不更改模型的情况下更改功能(委托(delegate)遵循签名!)。委托(delegate)的一个很好的例子,就是当你调用 List<T>.Sort
时.那是一个委托(delegate)。它有一个签名。
但您也可以将它们用于更高级的事情,例如更改 Renderer
类而不求助于接口(interface),并且能够提供用户定义的“片段”。我想这里最简单的类比是 Win32 中的所有者描述控件。不需要重写整个类,不需要提供接口(interface),写很多代码。只需更改呈现组合框中项目的位。委托(delegate)是您如何实现这一目标的绝佳示例。
关于c# - 使用特定示例了解 C# 中的委托(delegate)和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093325/
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Sample data for IPv6? 除了 wireshark 在其网站上提供的内容之外,是否有可以下
我正在寻找可以集成到现有应用程序中并使用多拖放功能的示例或任何现成的解决方案。我在互联网上找到的大多数解决方案在将多个项目从 ListBox 等控件拖放到另一个 ListBox 时效果不佳。谁能指出我
我是 GATE Embedded 的新手,我尝试了简单的示例并得到了 NoClassDefFoundError。首先我会解释我尝试了什么 在 D:\project\gate-7.0 中下载并提取 Ga
是否有像 Eclipse 中的 SWT 示例那样的多合一 JFace 控件示例?搜索(在 stackoverflow.com 上使用谷歌搜索和搜索)对我没有帮助。 如果它是一个独立的应用程序或 ecl
我找不到任何可以清楚地解释如何通过 .net API(特别是 c#)使用谷歌计算引擎的内容。有没有人可以指点我什么? 附言我知道 API 引用 ( https://developers.google.
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
我正在尝试为我的应用程序设计配置文件格式并选择了 YAML。但是,这(显然)意味着我需要能够定义、解析和验证正确的 YAML 语法! 在配置文件中,必须有一个名为 widgets 的集合/序列。 .这
你能给我一个使用 pysmb 库连接到一些 samba 服务器的例子吗?我读过有类 smb.SMBConnection.SMBConnection(用户名、密码、my_name、remote_name
linux服务器默认通过22端口用ssh协议登录,这种不安全。今天想做限制,即允许部分来源ip连接服务器。 案例目标:通过iptables规则限制对linux服务器的登录。 处理方法:编
我一直在寻找任何 PostProjectAnalysisTask 工作代码示例,但没有看。 This页面指出 HipChat plugin使用这个钩子(Hook),但在我看来它仍然使用遗留的 Po
我发现了 GWT 的 CustomScrollPanel 以及如何自定义滚动条,但我找不到任何示例或如何设置它。是否有任何示例显示正在使用的自定义滚动条? 最佳答案 这是自定义 native 滚动条的
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
我需要一个提交多个单独请求的 django 表单,如果没有大量定制,我找不到如何做到这一点的示例。即,假设有一个汽车维修店使用的表格。该表格将列出商店能够进行的所有可能的维修,并且用户将选择他们想要进
我有一个 Multi-Tenancy 应用程序。然而,这个相同的应用程序有 liquibase。我需要在我的所有数据源中运行 liquibase,但是我不能使用这个 Bean。 我的应用程序.yml
我了解有关单元测试的一般思想,并已在系统中发生复杂交互的场景中使用它,但我仍然对所有这些原则结合在一起有疑问。 我们被警告不要测试框架或数据库。好的 UI 设计不适合非人工测试。 MVC 框架不包括一
我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。 如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :A
$condition使用说明和 $param在 findByAttributes在 Yii 在大多数情况下,这就是我使用 findByAttributes 的方式 Person::model()->f
我在 Ubuntu 11.10 上安装了 qtcreator sudo apt-get install qtcreator 安装的版本有:QT Creator 2.2.1、QT 4.7.3 当我启动
我是一名优秀的程序员,十分优秀!