我担心我知道这个问题的答案但是...
是否有可能成功绑定(bind)到将在静态构造函数期间引发的静态事件?或者这在逻辑上是不可能的?
我的事件处理程序没有被命中。我怀疑这是因为当我这样做时...
MyClass.MyEvent += MyEventHandler;
...对 MyClass
的调用正在运行静态构造函数,因此在绑定(bind)处理程序时,该构造函数内的事件已经在该行代码的后面引发。
这样对吗?还有另一种方法吗?是否可以在不导致静态构造函数执行的情况下绑定(bind)到静态事件?
最佳答案
当您使用event
关键字声明一个事件时,您实际上是在声明两个方法,add
和remove
。将其想象成您声明一个属性:在幕后,您实际上是在声明一个 set
和一个 get
方法。事件也不异常(exception)。您实际上可以在代码中覆盖 add
和 remove
,with a custom event accesssor .
所以当你打电话
MyClass.MyEvent += MyEventHandler;
你真的在打电话
MyClass.MyEvent.add(MyEventHandler); //not real code
自然是静态构造函数has to be run whenever any method is accessed , 以确保类的静态状态是正确的。这是一个特点。因此,恐怕无法在添加到事件的同时延迟静态构造函数的执行。
如果你想稍后运行一些初始化,将它提取到一个单独的方法并单独调用它,或者像我的示例那样延迟加载它。另一种方法是懒惰地分配处理程序,正如 taquion 在他的回答中所建议的那样。我更喜欢我的答案,因为它是一种常见的模式,而且我希望其他工程师了解我的代码中发生了什么,尤其是当初始化逻辑在特定时间执行对您的应用程序至关重要时。
static public class MyClass
{
static bool _initialized = false;
static MyClass()
{
Console.WriteLine("Test.ctor called");
}
static void Initialize()
{
Console.WriteLine("Test.Initialize called");
_initialized = true;
}
static public event EventHandler MyEvent;
static public void RaiseMyEvent()
{
if (!_initialized) Initialize();
if (MyEvent != null) MyEvent(typeof(MyClass), new EventArgs());
}
}
关于c# - 如何在不调用静态构造函数的情况下将处理程序绑定(bind)到静态事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092093/