可以将事件声明为静态,如果是,如何以及为什么

时间:2010-05-07 14:51:43

标签: c#

我想知道我们是否可以将事件声明为静态,如果是为什么以及应用此类声明。

示例请相信

4 个答案:

答案 0 :(得分:58)

您可以创建静态事件。您可以像使用普通事件一样使用它们,除了它在类中的静态上下文中使用。

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)更明显的是您订阅了“全局”级别实例。

答案 1 :(得分:8)

是的,你可以。例如,请参阅Application.ApplicationExit。但是,请注意,在附加到静态事件时,该页面上有关内存泄漏的警告;适用于所有静态事件。

当你使用它们时没有什么神奇之处:当你需要为静态类提供事件或者只处理静态数据的事件时,以这种方式实现它是有意义的。

答案 2 :(得分:1)

是的,您可以将事件声明为静态。如果它们是实例事件,您可以像使用它们一样使用它们,但是您以静态方式访问事件名称(即ClassName.EventName,而不是variableName.EventName)。

现在......你想要静态事件吗?这是值得商榷的。我个人会说不,因为静态任何事情都会给测试带来困难,因此应尽可能避免。

但这肯定是可能的。

答案 3 :(得分:0)

public delegate void SomeEventDelegate();

public class SomeClass
{
        public static event SomeEventDelegate SomeEvent;
}