c# JIT 和静态构造函数

c# JIT and static constructors again

好的,我对上面的那两件事有点问题

以下情况:
我有一个抽象类"发射器"。这个类有一个静态字典来跟踪从它派生的所有类型。

例如,我有类"LinearEmitter",这个类有一个静态构造函数。此构造函数将 typeof(LinearEmitter) 添加到字典中。现在的问题是,当我想使用来自 Emitter 的静态字典(静态方法 "getMeEmitterFromID(int id)")时,可能会发生 "Emitter"(例如 LinearEmitter)的子代未初始化(我从文件中读取数据,然后从 "Emitter" 中的类中查找 id 并从中初始化一个实例。

我怎样才能确保每个 Child-class 之前都已初始化?(已将自己写在字典中)?

当然其他人应该使用这个库,他们也应该使用静态构造函数将他们的类添加到"Emitter"\\'s Dictionary

有什么想法吗?


Eric Lippert 刚刚发表了一篇关于静态构造函数的精彩系列文章。

静态构造函数第一部分,
静态构造函数第二部分,
静态构造函数第三部分,
静态构造函数第四部分

总结一下你的情况:静态构造函数被

调用

  • 就在第一次访问静态方法/字段之前。
  • 就在第一次访问该类型的实例之前。
  • 因此,您要么调用像 Initialize() 这样的静态方法,要么实例化从 Emitter 派生的类型的类。

    除此之外,我确信有更好的方法来解决您的问题,因为静态初始化程序的运行方式可能会随着不同的 .NET / CLR 版本而改变,如果您这样做,我不会依赖它不必。


    我不会公开 Dictionary 本身,而是将其作为实现细节。然后你可以创建一个类似 GetByType(Type typeToGetFromDictionary) 的方法。现在,get 方法可以延迟加载它还没有的部分。

    话虽如此,我同意您可能应该重新考虑架构的评论,因为这甚至可能没有必要。