微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决通过类的实例引发事件/订阅它们

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

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

}

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

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

以这种方式修改两行中的任何一行都会导致抛出相同的异常。

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

解决方法

我无法在此处重现您的问题。

你试过吗?

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类的实例。

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

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

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

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

Microsoft Docs 上的 this article 可以帮助您。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。