代表和活动

mar*_*kiz 1 c# events

我将它们用作不同对象之间的"通信",作为发布者和订阅者模式.

我看到一些例子,有时事件被声明为静态,有时它不是:

public delegate void LogProgress(string str)
public static event LogProgress LogProgressEvent;


 if (LogProgressEvent != null)
                LogProgressEvent(tempString);
Run Code Online (Sandbox Code Playgroud)

为什么以及何时需要使用静态?

Mar*_*ell 8

静态事件实际上非常危险,而且(幸运的是)也非常罕见.与静态的任何东西一样,当它一般适用于类型时,你会使用它,而不是任何特定的实例.即便如此,您可能会在单例实例上看到它而不是静态事件.

危险的是忘记取消订阅很容易,并最终使大量物体永远活着; 与大多数基于实例的事件形成对比 - 通常,实例最终会超出范围,使代理可收集(委托实例将使目标实例保持活动状态).