C# 事件是否可以声明为静态的,如果是,如何以及为什么

C# 事件是否可以声明为静态的,如果是,如何以及为什么,c#,C#,我想知道我们是否可以将事件声明为静态的,如果是,为什么以及这种声明的应用 样品请以眼还眼是的,你可以。例如,请参见。但是,请注意,该页上关于连接到静态事件时内存泄漏的警告;这适用于所有静态事件 使用它们并没有什么神奇之处:当您需要为静态类提供事件或专门处理静态数据的事件,并且以这种方式实现它是有意义的。是的,您可以将事件声明为静态。如果它们是实例事件,则使用它们的方式与使用它们的方式相同,但您以静态方式访问事件名称(即ClassName.EventName,而不是variableName.Eve

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


样品请以眼还眼

是的,你可以。例如,请参见。但是,请注意,该页上关于连接到静态事件时内存泄漏的警告;这适用于所有静态事件


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

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

现在。。。您想要静态事件吗?这是很有争议的。我个人会说不,因为任何静态的东西都会给测试带来困难,因此应该尽可能避免

public delegate void SomeEventDelegate();

public class SomeClass
{
        public static event SomeEventDelegate SomeEvent;
}

但这当然是可能的

您可以创建静态事件。除了在类中的静态上下文中使用之外,它们的使用方式与普通事件相同

public delegate void SomeEventDelegate();

public class SomeClass
{
        public static event SomeEventDelegate SomeEvent;
}
public class MyClass
{
    public static event EventHandler MyEvent;
    private static void RaiseEvent()
    {
        MyEvent?.Invoke(typeof(MyClass), EventArgs.Empty);
    }
}
也就是说,静态事件存在许多问题。您必须特别注意取消订阅静态事件中的对象,因为订阅静态事件将成为订阅实例的根,并阻止垃圾收集器收集它

此外,我还发现,在大多数情况下,如果我想生成静态事件,我倾向于在一个平台上使用标准事件。这与静态事件处理相同的场景,但是(IMO)更明显的是,您订阅的是“全局”级别的实例