Когда вы объявляете событие, используя ключевое слово event
, вы на самом деле объявляете два метода, add
и remove
. Думайте об этом, как когда вы объявляете свойство: под прикрытием вы действительно объявляете метод set
и get
. События ничем не отличаются; вы можете переопределить add
и remove
в коде, с помощью специального обработчика событий .
Так что, когда вы звоните
MyClass.MyEvent += MyEventHandler;
Вы действительно звоните
MyClass.MyEvent.add(MyEventHandler); //not real code
Естественно, статический конструктор должен запускаться всякий раз, когда к любому методу обращаются , чтобы обеспечить правильное статическое состояние класса. Это особенность. Поэтому я боюсь, что отложить выполнение статического конструктора при добавлении к событию невозможно.
Если вы хотите, чтобы некоторая инициализация выполнялась позже, извлеките ее в отдельный метод и вызовите ее отдельно или загрузите ее лениво, как в моем примере. Другой подход заключается в том, чтобы назначать обработчика лениво, как предлагает Такион в своем ответе. Я предпочитаю свой ответ, потому что это общий шаблон, и я бы хотел, чтобы другие инженеры понимали, что происходит в моем коде, особенно если для вашего приложения важно, чтобы логика инициализации выполнялась в определенное время.
static public class MyClass
{
static bool _initialized = false;
static MyClass()
{
Console.WriteLine("Test.ctor called");
}
static void Initialize()
{
Console.WriteLine("Test.Initialize called");
_initialized = true;
}
static public event EventHandler MyEvent;
static public void RaiseMyEvent()
{
if (!_initialized) Initialize();
if (MyEvent != null) MyEvent(typeof(MyClass), new EventArgs());
}
}