Подтвердить что ты не робот

Можно ли объявлять события как статические, если да, то как и почему

Я хочу знать, можем ли мы объявлять события как статические, если да, почему и применение такой декларации.

Образец, пожалуйста, как видите, верит

4b9b3361

Ответ 1

Вы можете создавать статические события. Вы используете их так же, как и обычное событие, за исключением того, что оно используется в статическом контексте внутри класса.

public class MyClass
{
    public static event EventHandler MyEvent;

    private static void RaiseEvent()
    {
        var handler = MyEvent;
        if (handler != null)
            handler(typeof(MyClass), EventArgs.Empty);
    }
}

При этом есть много проблем со статическими событиями. Вы должны проявлять особую осторожность, чтобы отменить подписку на свои объекты из статических событий, так как подписка на статическое событие запустит ваш подписной экземпляр и не позволит сборщику мусора собирать его.

Кроме того, я обнаружил, что в большинстве случаев, когда я хочу создавать статические события, я стараюсь научиться использовать стандартное событие на Singleton. Это обрабатывает те же сценарии, что и статическое событие, но является (IMO) более очевидным, что вы подписываетесь на экземпляр "глобального" уровня.

Ответ 2

Да, вы можете. См., Например, Application.ApplicationExit. Однако обратите внимание на предупреждения на этой странице об утечках памяти при подключении к статическим событиям; это относится ко всем статическим событиям.

Нет ничего волшебного в том, когда вы их используете: когда вам нужно предоставить событие для статического класса или события, которое занимается исключительно статическими данными, и имеет смысл реализовать его таким образом.

Ответ 3

Да, вы можете объявить событие статическим. Вы используете их так же, как если бы они были событиями экземпляра, но вы получаете доступ к имени события статическим способом (т.е. ClassName.EventName, а не variableName.EventName).

Теперь... вам нужны статические события? Это очень спорно. Я лично сказал бы "нет", поскольку статическое все создает трудности при тестировании и поэтому следует избегать, когда это возможно.

Но это, безусловно, возможно.

Ответ 4

public delegate void SomeEventDelegate();

public class SomeClass
{
        public static event SomeEventDelegate SomeEvent;
}