[英]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.