繁体   English   中英

通过 class 的实例引发事件/订阅它们

[英]Raising events/subscribing to them through an instance of the class

下面是一个使用事件简单地在屏幕上打印“成功”的程序。

using System;

class Program
{
    public event EventHandler TestEvent;

    static void Main(string[] args)
    {
        Program program = new();
        program.Start();
    }

    void Start()
    {
        TestEvent += Print;
        TestEvent(null, null);
    }

    public void Print(object sender, EventArgs e)
    {
        Console.WriteLine("Success");
    }

}

这按预期工作。 但是,如果我尝试通过 class 的实例访问 TestEvent 事件,它会抛出异常,说 TestEvent 是 null,好像 program.TestEvent 和 TestEvent 指的是两个完全不同的东西。

void Start()
{
    Program program = new();
    program.TestEvent += Print;
    program.TestEvent(null, null);
}

以这种方式修改两行中的任何一行都会引发相同的异常。

现在,这本身并不是一个大问题,因为没有真正需要通过 class 的实例访问事件(除非该事件是另一个 class 的成员,在这种情况下该方法工作得很好)。 我只是想知道我在打破什么规则,因为对我来说,这两段代码似乎都应该做同样的事情。 显然情况并非如此。

我无法在这里重现您的问题。

你试过这个吗?

static void Main(string[] args)
{
    Program program = new Program();
    program.TestEvent += program.Print;
    program.TestEvent(null, null);
    program.Start();
}

顺便说一句,您应该始终使用以下模式来引发事件:TestEvent?.Invoke(null,null)

在 Main() 中,作为入口点,它已经初始化了 Program class 的一个实例。

 static void Main(string[] args) { Program program = new(); program.Start(); }

没有必要再创建一个。 您不能从当前程序中调用其他实例。 实际上,甚至不需要初始化 Program 的实例,因为 Main 方法是 static。 它也是这样工作的:

static void Main(string[] args)
{        
   Start();
}

void Start()
{
    TestEvent += Print;
    TestEvent(null, null);
}

这篇关于 microsoft Docs 的文章对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM