2013-05-02 51 views
3

当我创建将在应用程序的不同区域使用的事件时,我会重复使用下面的代码。我发现它非常有用,它使事件在代码中很容易遵循。有没有任何理由为什么这可能是一个坏主意?这有点宽泛,但基本上没有理由不这样做?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); 

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

+2

包装本身是一个不同的点,'null'发送者是可怕的,如果你不能传播,那么整个事情也是可怕的。 – 2013-05-02 13:55:00

回答

9

static事件的最大问题是您需要真的注意取消订阅。对于实例事件,如果不取消订阅,那么最终可能会保留图的一部分,直到对象与事件一起发布且无法访问(使所有订阅者无法访问) - 然而,static事件永远不会变得无法到达。这意味着任何不退订的用户都将无法访问永不,并且永远不会被垃圾收集。

4

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

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