C#中静态事件的负面影响/不良做法

当我创建将在应用程序的不同区域中使用的事件时,我会重复使用下面的代码。 我觉得它非常有用,它使事件很容易在代码中遵循。 有什么理由说这可能是一个坏主意吗? 这有点宽泛,但基本上有理由不这样做吗?

活动课程:

public delegate void FocusEventHandler(object source, FocusEventArgs e); class FocusEvent { public static event FocusEventHandler focusEvent; public static void Focus(bool status) { focusEvent(null, new FocusEventArgs(status)); } } public class FocusEventArgs : EventArgs { public bool Focused { get; set; } public FocusEventArgs(bool f) { Focused = f; } } 

所以我需要的是:

 FocusEvent.Focus(false); 

多谢你们。 这有很大帮助。 我真的需要阅读内存使用情况。

static事件的最大问题是您需要非常小心取消订阅它们。 对于实例事件,如果您没有取消订阅,那么您可能最终会将图形的一部分人为地保留,直到具有该事件的对象被释放并且无法访问(使所有订阅者无法访问) – 但是, static事件永远不会变得无法访问 。 这意味着任何未取消订阅的订阅者将永远无法访问,并且永远不会被垃圾回收。

几年前,我参与了一个使用静态事件的大型Windows应用程序。 在调查一些内存使用问题时,我发现整个应用程序中的表单都没有被垃圾收集 。 几乎每个表格都订阅了一个静态事件,但从未取消订阅,导致它们永远存在。

所以是的,不这样做的主要原因是你不可避免地忘记在某个时候取消订阅事件,导致事情在应用程序的生命周期中停留。