c#JIT和静态构造函数

时间:2013-02-15 18:34:03

标签: c# static constructor jit

好吧,我对那两件事有点问题

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

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

如何确保每个Child-class之前都已初始化?(已在字典中写过)?

当然其他人应该使用这个库,他们也应该使用静态构造函数将他们的类添加到“Emitter”的词典

任何想法?

2 个答案:

答案 0 :(得分:2)

Eric Lippert刚刚有一个关于静态构造函数的系列文章。

Static Constructors Part OneStatic Constructors Part TwoStatic Constructors Part ThreeStatic Constructors Part Four

在你的情况下总结有用位:静态构造函数由

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

    除此之外,我确信有更好的方法来实现您的问题,因为静态初始化程序运行的方式可能会在不同的.NET / CLR版本上发生变化,如果您不依赖于此不必。

答案 1 :(得分:0)

我不会公开Dictionary本身,而是将它作为一个实现细节。然后你可以制作像GetByType(Type typeToGetFromDictionary)这样的方法。现在,get方法可以懒得加载它还没有的部分。

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