如果我在发送时在c#中注册了一个事件,我保证在发送期间不再被调用吗?

fas*_*all 5 c# mono events

在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");
    }
Run Code Online (Sandbox Code Playgroud)

至少在Windows上,输出是:

First
First
Second
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

是的,这是有保证的.

从统一的C#3.0规范,第15.1节:

但是,当组合两个非空委托实例时,它们的调用列表以左操作数和右操作数的顺序连接 - 形成一个新的调用列表,其中包含两个或多个条目.

请注意"新调用列表".并再次在第15.3节:

实例化后,委托实例始终引用相同的目标对象和方法.请记住,当两个委托组合在一起,或者一个委托从另一个委托中删除时,新的委托会产生自己的调用列表; 组合或删除的代理的调用列表保持不变.

最后,System.Delegate的MSDN声明:

代表是不变的; 创建后,委托的调用列表不会更改.

我怀疑CLI规范中有一些东西 - 我会检查你是否愿意,但希望这三个给你足够的信心:)