включая само событие
Нет, ты не можешь этого сделать. «Событие» - это на самом деле просто некоторые методы доступа. Предполагая, что вы имеете в виду делегата поддержки, это было бы очень плохо - делегаты неизменны: каждый раз, когда вы добавляете / удаляете подписчика, вы получаете другой делегат.
На самом деле, теперь компилятор 4.0 делает это с кодом без блокировки, используя Interlocked
- возможно, стоит придерживаться этого подхода.
В вашем примере objectLock
гарантирует, что все вызывающие (для этого экземпляра) блокируются на один и тот же объект, что важно, но без уродства блокировки на this
(который является как компилятор C # использовал для работы).
-
Обновление: в вашем примере показан код, необходимый до C # 4.0, доступ к полевому событию внутри тип говорил непосредственно с полем: обычная блокировка полевого события не была соблюдена , Это было изменено в C # 4.0; теперь вы можете (в C # 4.0) безопасно переписать это как:
public class Shape : IDrawingObject, IShape
{
// Create an event for each interface event
event EventHandler PreDrawEvent;
event EventHandler PostDrawEvent;
event EventHandler IDrawingObject.OnDraw
{
add { PreDrawEvent += value; }
remove { PreDrawEvent -= value; }
}
}
Затем следует все правильное поведение.