В C # я иногда хочу зарегистрировать метод для события в середине отправки того же самого события. Например, если у меня есть класс, который передает состояния на основе последовательных отправлений одного и того же события, я мог бы захотеть, чтобы обработчик первого состояния отменил свою регистрацию и зарегистрировал второй обработчик. Однако я не хочу, чтобы второй обработчик отправлялся до следующего запуска события.
Хорошей новостью является то, что, похоже, реализация Microsoft C # ведет себя именно так. Синтаксический синтаксис регистрации события заменяется вызовом System.Delegate.Combine, который просто объединяет текущий список вызовов и новый метод в отдельный список и назначает его свойству события. Это дает мне именно то поведение, которое я хочу.
Итак, мой вопрос: это гарантированное поведение в соответствии со стандартом языка? Мне нравится иметь возможность запускать мой код C # на других платформах под управлением mono и, как правило, хочу убедиться, что я не делаю предположений относительно языкового стандарта на основе его реализации.
Я не смог найти точную информацию о 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