да. Я должен записать алгоритмы шифрования прежде, и это определенно использует их.
Они также полезны при использовании целых чисел и т.д. для того, чтобы отслеживать состояния.
Причина, по которой ваш пример кода не работает, заключается в том, что объявление события и код, который подписывается на него, находится в том же классе.
В этом случае компилятор «оптимизирует» код, заставляя код, который подписывается на событие, обращаться непосредственно к базовому полю.
В основном, вместо того, чтобы делать это (как и любой код вне класса):
o.add_Event(delegateInstance);
он делает это:
o.EventField = (DelegateType)Delegate.Combine(o.EventField, delegateInstance);
поэтому у меня к вам следующий вопрос: имеет ли ваш реальный пример такое же расположение кода? Находится ли код, который подписывается на событие, в том же классе, который объявляет событие?
Если да, то следующий вопрос: должно ли оно присутствовать или действительно должно быть перемещено из него? Вынося код из класса, вы заставляете компилятор использовать add
и? remove
специальные методы, которые добавляются к вашему объекту.
Другой способ, если вы не можете или не хотите перемещать код, - это взять на себя ответственность за добавление и удаление делегатов для вашего события:
private EventHandler _TimerExpired;
public event EventHandler TimerExpired
{
add
{
_TimerExpired += value;
}
remove
{
_TimerExpired -= value;
}
}
Это заставляет компилятор вызывать добавление и удаление даже из кода внутри того же класса.
События в удаленном режиме работают нормально, но есть некоторые сложности, и я предполагаю, что вы столкнулись с одним из них.
Основная проблема заключается в том, что для клиента необходимо подписаться Для события удаленного серверного объекта инфраструктура должна иметь информацию о типе как для клиента, так и для сервера, доступную на обоих концах. Без этого вы можете получить некоторые исключения удаленного взаимодействия, похожие на то, что вы видите.
Есть способы обойти это, в том числе использовать шаблон наблюдателя вручную (вместо использования события напрямую) или предоставить доступный базовый класс или интерфейс. по обе стороны провода.
Я рекомендую прочитать эту статью CodeProject . Он проходит через использование событий с удаленным взаимодействием и хорошо описывает эту проблему в разделе «Создание событий от удаленных объектов».