4

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

活动类别:

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);

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

4

2 回答 2

12

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

于 2013-05-02T13:58:50.860 回答
4

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

所以,是的,不这样做的主要原因是您不可避免地会忘记在某些时候取消订阅该事件,从而导致事情在应用程序的整个生命周期内一直存在。

于 2013-05-02T13:57:48.170 回答