#c# #events
#c# #Мероприятия
Вопрос:
Недавно я снова наткнулся на проблему, касающуюся событий, и я не смог найти ничего, что отвечало бы на то, что на самом деле делает этот синтаксис: event1 = event2
Вот 2 примера методов с одинаковыми событиями для целей тестирования:
private event Action A = null;
private event Action B = null;
private event Action C = null;
Эта версия (упрощенная) действительно работает (которую я использовал, при этом каждое событие имеет свой собственный метод запуска):
private void DoTest1 ()
{
A = () => DebugText ($"A Test");
A = () => B.Invoke ();
B = () => DebugText ($"B Test");
B = () => C.Invoke ();
C = () => DebugText ($"C Test");
A.Invoke ();
// Result: A Test, B Test, C Test
}
Это работает не так, как ожидалось:
private void DoTest2 ()
{
A = () => DebugText ($"A Test");
A = B;
B = () => DebugText ($"B Test");
B = C;
C = () => DebugText ($"C Test");
A.Invoke ();
// Result: A Test
}
Итак, мне интересно, почему компилятор принимает синтаксис, если он, похоже, не работает? Чего мне здесь не хватает?
Комментарии:
1. Отладьте DoTest2 и посмотрите, не равно ли значение B нулю, когда оно добавляется к A?
2. Я думаю, что они разрешаются во время сборки. Проверьте этот порядок , а затем этот
3. @Cid — Думаю, теперь я понимаю, спасибо! Это потому, что таким образом события просто складывают свое текущее содержимое, а не связывают их вместе каким-либо постоянным способом. Я помню, что узнал об этом давным-давно, но забыл эту часть. Кстати, отличный сайт!
4. Предположим, что вместо событий и делегатов у вас было
int A = 1; int B = 10;
. Если вы скажетеA = A B; B = B 10; Console.WriteLine(A);
, что вы ожидаете записать? (1)11
потомуA B
что во время назначения было 11 или (2)21
потому что во время выполнения строки записи каким-то образом известно, что сталоA
B
20? Чего вы ожидаете?