静态事件如何与C#中的非静态事件进行比较?

Aar*_*ide 15 c# events static-members

我刚刚意识到静态事件的存在 - 我很好奇人们如何使用它们.我想知道相对比较如何与静态与实例方法保持一致.例如,静态方法基本上是一个全局函数.但我总是将事件与对象实例联系起来,而我在全球范围内无法思考它们.

这里有一些代码可以参考它是否有助于解释:

void Main()
{
    var c1 = new C1();
    c1.E1 += () => Console.WriteLine ("E1");
    C1.E2 += () => Console.WriteLine ("E2");
    c1.F1();
}

// <<delegate>>+D()
public delegate void D();

// +<<event>>E1
// +<<class>><<event>>E2
// +F()
//      <<does>>
//          <<fire>>E1
//          <<fire>>E2
public class C1
{
    public void F1()
    {
        OnE1();
        OnE2();
    }
    public event D E1;
    private void OnE1()
    {
        if(E1 != null)
        {
            E1();
        }
    }
    static public event D E2;
    static private void OnE2()
    {
        if(E2 != null)
        {
            E2();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 45

警惕静态事件.请记住,当一个对象订阅一个事件时,该事件的发布者将持有对该对象的引用.这意味着您必须非常小心地明确取消订阅静态事件,因为它们将使订户永远保持活动,即,您最终可能会遇到内存泄漏的托管等效项.

  • @TheDag:当然,或者有时订阅的对象在您的应用程序的整个生命周期中都存在.问题是,每次订阅此静态事件时,您现在必须*考虑*.它增加了精神开销,并不是每个人都会意识到发生了什么. (4认同)
  • 好点子.但在某些情况下,这可能不是问题.有时处理程序也可以是静态的.或者它可能存在于单身人士身上. (3认同)

Ben*_*igt 14

在消息传递方面可以考虑大部分OOP.

方法调用是从调用者到被调用者(携带参数)的消息和带有返回值的消息.

事件是从源到订户的消息.因此可能涉及两个实例,一个发送消息,另一个接收消息.

对于静态事件,没有发送实例(只是一个类型,可能是也可能不是类).仍然可以将接收者实例编码为委托的目标.