如何初始化事件

Ale*_*aro 3 .net c# events

我有一个类似这样的事件的课程

public class A
{
    public event Func<string, string> Message;

    public void Calling()
    {
        Message("Hello world!");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我调用该Calling()方法并且还没有人订阅该Message事件,则它为null并抛出异常.

如何初始化我的活动?

Bri*_*oll 5

您没有初始化事件,而是需要在Calling方法中检查null:

public void Calling()
{
    if (Message != null)
        Message("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*iho 5

事件初始化。要的价值null。解决方法是先检查是否为空。规范方法如下所示:

public void Calling()
{
    Func<string, string> handler = Message;

    if (handler != null)
    {
        handler("Hello world!");
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,检查之前将事件值复制到本地。这样可以确保在检查事件null和调用事件之间不会同时更改事件。在许多程序中,这是不需要的(无需并发),您可以放心地直接检查事件本身。

如果您使用的是支持空条件运算符的C#版本(6.0或更高版本),则可以将上述内容很好地简化为:

public void Calling()
{
    Message?.Invoke("Hello world!");
}
Run Code Online (Sandbox Code Playgroud)

编译器将为您生成引用的中间副本,对其进行检查null,并仅在该Invoke()方法为非null时调用该方法。