如果我在发送时在c#中注册一个事件,我保证在发送期间不再被调用吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如果我在发送时在c#中注册一个事件,我保证在发送期间不再被调用吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1820字,纯文字阅读大概需要3分钟。
内容图文
![如果我在发送时在c#中注册一个事件,我保证在发送期间不再被调用吗?](/upload/InfoBanner/zyjiaocheng/806/15279b448aef449fae9567c4b24ea2bb.jpg)
在C#中,我发现自己偶尔想要在发送同一事件的过程中为事件注册一个方法.例如,如果我有一个基于相同事件的连续调度转换状态的类,我可能希望第一个状态的处理程序取消注册自身并注册第二个处理程序.但是,我不想在下次触发事件之前调度第二个处理程序.
好消息是,C#的Microsoft实现看起来就像这样.事件注册语法sugar被调用System.Delegate.Combine替换,System.Delegate.Combine只将当前调用列表和新方法连接到一个单独的列表中,并将其分配给事件属性.这给了我我想要的行为.
所以,我的问题是:这是语言标准的保证行为吗?我希望能够在单声道的其他平台上运行我的C#代码,并且通常希望确保我不基于其实现对语言标准做出假设.
我在MSDN上找不到任何确切的信息.
如果你想要我所谈论的具体例子,这里有一个例子:
delegate void TestDelegate();
static event TestDelegate TestEvent;
static void Main (string[] args) {
TestEvent += TestDelegateInstanceFirst;
TestEvent();
TestEvent();
}
static void TestDelegateInstanceFirst () {
Console.WriteLine("First");
TestEvent += TestDelegateInstanceSecond;
}
static void TestDelegateInstanceSecond () {
Console.WriteLine("Second");
}
至少在Windows上,输出是:
First
First
Second
解决方法:
是的,这是有保证的.
从统一的C#3.0规范,第15.1节:
However, when two non-null delegate
instances are combined, their
invocation lists are concatenated—in
the order left operand then right
operand—to form a new invocation list,
which contains two or more entries.
请注意“新调用列表”.并再次在第15.3节:
Once instantiated, delegate instances
always refer to the same target object
and method. Remember, when two
delegates are combined, or one is
removed from another, a new delegate
results with its own invocation list;
the invocation lists of the delegates
combined or removed remain unchanged.
最后,System.Delegate的MSDN声明:
Delegates are immutable; once created,
the invocation list of a delegate does
not change.
我怀疑CLI规范中有一些东西 – 我会检查你是否愿意,但希望这三个给你足够的信心:)
内容总结
以上是互联网集市为您收集整理的如果我在发送时在c#中注册一个事件,我保证在发送期间不再被调用吗?全部内容,希望文章能够帮你解决如果我在发送时在c#中注册一个事件,我保证在发送期间不再被调用吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。