如何解决通过类的实例引发事件/订阅它们
下面是一个使用事件在屏幕上简单地打印“成功”的程序。
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 举报,一经查实,本站将立刻删除。