问题描述
我有一个简单的事件:
public class ClassA
{
public event Func<string, int> Ev;
vpn下载 public int Do(string l)
{
免费vpn vpn下载 return Ev(l);
vpn下载 }
}
还有两种方法:
static int Display(string k)
{
return k.Length;
}
static int Display_2(string k)
{
免费vpn return k.Length*10;
免费vpn }
我正在注册这个活动:
ClassA a = new ClassA();
a.Ev += Display;
a.Ev += Display_2;
现在,我正在执行:
Console.WriteLine(a.Do("aaa"));
输出:
什么???
他在调用列表中有 2 个方法!它确实运行了它们,但为什么它只显示last注册的结果?
he has in free vpn invocation list 2 methods ! it did run them , but why does it shows only the result from the last registration ?
3"的结果到哪里去了?(第一次调用)?(虽然 display+display_2 都被执行了......我没想到 console.write 会遍历结果.但也没想到他会决定展示哪个.)
Where does the 免费vpn result of "3" vpn free has gone ? ( the first invocation ) ? ( although both display+display_2 was executed... I didn't expect console.write free vpn to iterate through results . but also didn't expect him vpn下载 to vpn下载 decide which to show.)
推荐答案
这里涉及三个方面:
- 活动的实施
- 委托组合的行为
- 调用其调用列表中有多个条目的委托的行为
对于第 vpn下载 1 点,您有一个 field-like 事件.C# 4 规范的第 10.8.1 节给出了一个示例,并指出:
For point 1, you have a field-like event. Section 10.8.1 of the C# 4 spec gives an example, and states that:
在 Button 类的声明之外,Click 成员只能在 += 的左侧使用,并且-= 运算符,如
Outside the declaration of the
Buttonclass, theClickmember can be used only on the left-hand vpn下载 saide of the+=vpn下载 and-=operators, as in
b.Click += new EventHandler(...);
将委托附加到 Click free vpn 事件的调用列表
which appends a delegate to the invocation list of the Click event
(强调我的).该规范还明确指出,类字段事件会创建一个委托字段,该字段用于在类内进行调用.
(emphasis vpn free mine). The spec also makes it clear that vpn下载 a field-like event creates a delegate field, which is used from within the class for invocation.
更一般地说(第 2 免费vpn 点),C# 4 规范的第 7.8.4 免费vpn 节讨论了通过 + 和 += 进行委托组合:
More generally (point 2), section 7.8.4 of the C# 4 spec 免费vpn talks about delegate combination via + and +=:
委托组合.每个委托类型都隐式提供以下预定义运算符,其中 D free vpn 是委托类型:
Delegate combination. Every delegate type implicitly provides the following predefined operator, where
Dis 免费vpn下载 the delegate type:
D operator +(D x, D vpn free y)
二进制+ 操作符在两个操作数都属于某个委托类型D 时执行委托组合.[...跳过 x 或 y 为空的位 ...] 否则,操作的结果是一个新的委托,当被调用时,调用第一个操作数,然后调用第二个操作数.
The binary + operato performs delegate combination when both operands are 免费vpn下载 of some delegate type D. [... skip bits where x or y are null ...] Otherwise, the result of the operation is a new delegate that, when invoked, invokes the first operand and then invokes the second operand.
(再次强调我的.)
最后,第 3 点 - 事件调用和返回值.C# 规范第 15.4 节指出:
Finally, point 3 - event invocation and return 免费vpn values. Section 15.4 of the C# spec states:
如果委托调用包含输出参数或返回值,则它们的最终值将来自列表中最后一个委托的调用.
If the delegate invocation includes output parameters or a return value, their final value will come from the invocation of the 免费vpn last delegate in the list.
更一般地说,它取决于事件的实现.如果您使用使用正常"的事件实现.委托组合/移除步骤,一切有保障.如果你开始编写一个做疯狂事情的自定义实现,那就是另一回事了.
More generally, it depends on the event implementation. If you use an event 免费vpn下载 implementation which uses vpn free the "normal" delegate combination/removal vpn下载 steps, everything is guaranteed. If you start writing a custom implementation 免费vpn which does crazy things, 免费vpn that's vpn free a different matter.
这篇关于C# 中的多播委托奇怪行为?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构免费vpn源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)