为什么这个Action事件为空?

本文关键字:事件 Action 为什么 | 更新日期: 2023-09-27 18:02:15

我目前有2个WinForms。

FormA创建一个FormB的实例。我调用FormBShowDialog()方法。

FormB定义public event Action<SomeClass, string> Analyze

当我点击FormBProcessEvent按钮时,我做了以下操作:

Action<SomeClass, string> tempAction = Analyze;
if (tempAction != null)
{
  tempAction.Invoke(instanceOfSomeClass, someString);
}

但是事件没有被调用,因为tempAction为空。

为什么它是空的?

我在FormA中以相同的方式定义事件,它们工作得很好。

编辑:

我有一个订阅事件的presenter类:

formBInstance.Analyze += StartAnalyze

为什么这个Action事件为空?

您必须为事件签名。如果没有订阅者,Analyze将为null

FormB form = new FormB();
form.Analyze += OnAnanlyze; // define callback function

其他人已经回答了你最初的问题。我只是想补充一些你应该考虑的问题。

<<p> 事件初始化/strong>

首先,您可以使用' delegate{} '作为所有事件的初始化项,以便能够跳过null检查,并使您的事件线程安全。

的例子:

public class MyClass
{
    public event EventHandler<TempActionArgs> TempAction = delegate {};
}

这样你就可以通过

调用它
TempAction(this, new TempActionArgs(someStrings);

不需要任何检查

使用标准事件机制

事件不要使用Action<>。一定要使用标准的EventHandler/EventArgs机制,使您的应用程序看起来像任何其他。net应用程序。我认为Action<>应该只用于临时调用(而不是在对象生命周期中)。LINQ方法就是一个很好的例子。