c# - 如何在不调用静态构造函数的情况下将处理程序绑定(bind)到静态事件?

标签 c# events poco

我担心我知道这个问题的答案但是...

是否有可能成功绑定(bind)到将在静态构造函数期间引发的静态事件?或者这在逻辑上是不可能的?

我的事件处理程序没有被命中。我怀疑这是因为当我这样做时...

MyClass.MyEvent += MyEventHandler;

...对 MyClass 的调用正在运行静态构造函数,因此在绑定(bind)处理程序时,该构造函数内的事件已经在该行代码的后面引发。

这样对吗?还有另一种方法吗?是否可以在不导致静态构造函数执行的情况下绑定(bind)到静态事件?

最佳答案

当您使用event 关键字声明一个事件时,您实际上是在声明两个方法,addremove。将其想象成您声明一个属性:在幕后,您实际上是在声明一个 set 和一个 get 方法。事件也不异常(exception)。您实际上可以在代码中覆盖 addremovewith 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/

相关文章:

c# - 为什么只有最后一个菜单项有图标?

python - 暂停 Python 脚本,直到用户点击 plot 两次

performance - 与数据 View 相比,Linq 到对象的速度非常慢

asp.net - 如何向我的 POCO(template) 类添加验证

C# - SMO - 如何检查我是否具有对给定数据库的独占访问权限(即检查数据库是否正在使用中)?

c# - 如何在 Window Phone 中捕获电话通话状态

c# - 从 CLR 样式的类型全名获取 C# 样式的类型引用

javascript : window. location.href 位于 "if"内

javascript - JavaScript 中的自定义事件处理

asp.net-mvc - 向 POCO 类添加方法