|
|
1
332
一 事件 声明为 代表 例子此保护可防止代理的客户端重置代理及其调用列表,并且只允许在调用列表中添加或删除目标。 |
|
|
2
142
为了理解差异,你可以看这两个例子 带有委托的示例(在这种情况下,是一个Action,这是一种不返回值的委托)
要使用委托,您应该这样做:
这段代码运行良好,但可能存在一些弱点。 例如,如果我写下:
在最后一行代码中,我覆盖了前面的行为,只缺少一个
另一个弱点是,每个使用你的
为了避免这些弱点,你可以使用
你的动物类将以这种方式改变:
调用事件
差异:
笔记: 事件处理程序被声明为以下委托:
它接受一个发送方(Object类型)和事件参数。如果发送方来自静态方法,则为null。
此示例使用
参考 here 有关事件处理程序的文档 |
|
|
3
111
除了句法和操作属性外,还有语义差异。 从概念上讲,委托是功能模板;也就是说,它们表达了一个函数必须遵守的契约,才能被视为委托的“类型”。 事件代表。..好吧,事件。它们的目的是在发生事情时提醒某人,是的,它们遵守委托定义,但它们不是一回事。 即使它们完全相同(在语法和IL代码中),语义上的差异仍然存在。一般来说,我更喜欢为两个不同的概念命名,即使它们以相同的方式实现(这并不意味着我喜欢两次使用相同的代码)。 |
|
4
38
这里还有一个很好的链接可以参考。 http://csharpindepth.com/Articles/Chapter2/Events.aspx 简而言之,本文的结论是——事件是对委托的封装。 引用文章:
|
|
|
5
10
活动和代表之间存在多么大的误解!!!委托指定一个TYPE(例如
最后,我们可以做以下几点 观察:事件的类型必须由代表定义 。这是活动和代表之间的主要关系,在本节中进行了描述 II、 18定义事件 属于的 ECMA-335 (CLI) Partitions I to VI :
然而,
这一事实并不意味着事件使用了支持委托字段
事实上,一个事件可能会使用您选择的任何不同数据结构类型的支持字段。如果你在C#中显式地实现了一个事件,你可以自由选择存储事件的方式
事件处理程序
(注意
事件处理程序
是以下实例
事件类型
,这反过来又是强制性的
委托类型
---从以前
观察
).但是,您可以将这些事件处理程序(即委托实例)存储在数据结构中,例如
|
|
|
6
8
注意:如果您有权访问 C# 5.0 Unleashed ,请阅读第18章“事件”中的“简单使用代表的限制”,以更好地理解两者之间的差异。
它总是帮助我有一个简单,具体的例子。这里有一个社区。首先,我将演示如何单独使用委托来完成Events为我们做的事情。然后,我将展示相同的解决方案如何与以下实例一起工作
示例1:使用公共委托
假设我有一个带有单个下拉框的WinForms应用程序。下拉菜单绑定到
这是它的工作原理。我们有三个文件可以帮助我们将其组合在一起:
以下是每个类的相关代码:
以下是我们的用户控制:
最后,我们在Form1.cs中有以下代码。这里我们调用OnPersonChanged,它调用订阅给委托的任何代码。
好的。这就是你如何让这个工作 不使用事件 和 仅使用代理 我们只是将一个公共委托放入一个类中——你可以将其设置为静态或单例,或者其他任何形式。太棒了 但是,但是,但是我们不想做我刚才描述的事情。因为 public fields are bad 原因有很多。那么,我们有什么选择呢?正如John Skeet所描述的,以下是我们的选择:
第三种选择本质上就是事件给我们的。当我们声明一个事件处理程序时,它让我们可以访问一个委托——不是公开的,也不是作为一个属性,但我们称之为一个只有添加/删除访问器的事件。 让我们看看相同的程序是什么样子的,但现在使用事件而不是公共委托(我还将我们的中介更改为单例): 示例2:使用事件处理程序而不是公共委托 调解员:
请注意,如果您在EventHandler上按F12,它将显示定义只是一个带有额外“sender”对象的通用化委托:
用户控制:
最后,这是Form1.cs代码:
因为事件处理程序希望将和ViewModel作为参数,所以我创建了一个只有一个属性的类:
希望这能让你了解一下为什么我们有活动,以及它们作为代表是如何不同的,但在功能上是相同的。 |
|
|
7
5
您还可以在接口声明中使用事件,但不适用于委托。 |
|
|
8
5
Delegate是一个类型安全的函数指针。事件是使用委托实现发布者-订阅者设计模式。 |
|
|
9
4
.net中的事件是Add方法和Remove方法的指定组合,这两种方法都需要某种特定类型的委托。C#和vb.net都可以自动生成add和remove方法的代码,这些方法将定义一个持有事件订阅的委托,并向该订阅委托添加/从该订阅委托中删除传入的委托。VB.net还将自动生成代码(使用RaiseEvent语句),以在订阅列表非空时调用订阅列表;出于某种原因,C#不会生成后者。 请注意,虽然使用多播委托管理事件订阅很常见,但这并不是唯一的方法。从公共角度来看,潜在的事件订阅者需要知道如何让对象知道它想要接收事件,但它不需要知道发布者将使用什么机制来引发事件。还要注意的是,虽然在.net中定义事件数据结构的人显然认为应该有一种公开的方法来提高它们,但C#和vb.net都没有利用这一特性。 |
|
|
10
2
以简单的方式定义事件: 事件是 参考 给有两个限制的代表
以上两点是代表们的弱点,将在活动中加以解决。显示fiddler差异的完整代码示例在这里 https://dotnetfiddle.net/5iR3fB . 在事件和委托以及调用/分配值给委托的客户端代码之间切换注释,以了解差异 这是内联代码。
|
|
11
2
因为人们生活在2020年,想要一个干净的答案。.. 定义:
关于形容词 受保护的 :
另请注意Microsoft的此部分: https://learn.microsoft.com/en-us/dotnet/standard/events/#raising-multiple-events 代码示例:
具有
|
|
OREO · 如何在不实际单击复选框的情况下选中它 1 年前 |
|
|
Dan · 在元素外部设置html点击处理程序点击后立即触发 1 年前 |
|
|
Mero · Svelte在父事件调用上调用新的嵌套事件处理程序 2 年前 |
|
|
iorice · usercontrol dll中的组件事件 2 年前 |
|
|
Awin · 点击事件功能不适用于Vue组件 2 年前 |
|
|
Kiwi · 将可共享的自定义数据添加到事件MS图形api 2 年前 |